当前位置: 首页 > wzjs >正文

WordPress下载统计呼市网站优化

WordPress下载统计,呼市网站优化,学院网站建设需求说明书,网页制作素材和实例AVL树是严格平衡的。 红⿊树是⼀棵⼆叉搜索树。 通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束&#xff0c;红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍&#xff0c;因⽽是接近平衡的。即最长路径<最短路径的2倍。 红黑树规则&#xff1a; 1. 每个结点不是红⾊…

AVL树是严格平衡的。

红⿊树是⼀棵⼆叉搜索树。 通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因⽽是接近平衡的。即最长路径<=最短路径的2倍。

红黑树规则:

1. 每个结点不是红⾊就是⿊⾊

2. 根结点是⿊⾊的

3. 如果⼀个结点是红⾊的,则它的两个孩⼦结点必须是⿊⾊的,也就是说任意⼀条路径不会有连续的 红⾊结点。即不存在连续红色的。

4. 对于任意⼀个结点,从该结点到其所有NULL结点的简单路径上,均包含相同数量的⿊⾊结点。即每条路径的黑色节点的个数相等。(比较严格)

新插入节点插入红色。如果插入黑色就一定会违反规则4,因为规则4比较严格,所以不要破坏规则4。

 红黑树的抽象图:

情况一:cur是新增节点,cur是红,p是红,u是红且存在,g是黑。

变换规则是:

 

代码如下所示:

	//1.叔叔存在且是红。p变黑,u变黑,g变红。如果g是根再次变黑,否则继续向上更新。if (uncle && uncle->_col == RED){parent->_col = uncle->_col = BLACK;grandfather->_col = RED;cur = parent;//继续向上更新parent = cur->_parent;}//2.叔叔不存在/存在且是黑else{if (cur == parent->_left)//单旋{//     g                 p//   p   u------>     c    g// c                          uRotateR(grandfather);parent->_col = BLACK;grandfather->_col = RED;}else//双旋{//      g                 g            c//   p     u    ->      c    u   ->  p     g//      c             p                        uRotateL(parent);RotateR(grandfather);cur->_col = BLACK;grandfather->_col = RED;}break;}
}

情况二:cur是新增节点,cur是红,p是红,g是黑,u不存在/存在且为黑。

 情况二还有一种情况是双旋+变色。具体的实现代码如下所示:

	//2.叔叔不存在/存在且是黑
else
{if (cur == parent->_left)//单旋{//     g                 p//   p   u------>     c    g// c                          uRotateR(grandfather);parent->_col = BLACK;grandfather->_col = RED;}else//双旋{//      g                 g            c//   p     u    ->      c    u   ->  p     g//      c             p                        uRotateL(parent);RotateR(grandfather);cur->_col = BLACK;grandfather->_col = RED;}break;
}

 整体代码如下:

enum Colour
{RED,BLACK
};
template<class K,class T>
struct RBTreeNode {RBTreeNode<K, T>* _left;RBTreeNode<K, T>* _right;RBTreeNode<K, T>* _parent;pair<K, T> _kv;Colour _col;RBTreeNode(const pair<K, T>& kv):_left(nullptr),_right(nullptr),_parent(nullptr),_kv(kv),_col(RED){}
};template<class K,class V>
class RBTree
{typedef RBTreeNode<K, V> Node;
public:bool Insert(const pair<K, V>& kv){if (_root == nullptr){_root = new Node(kv);_root->_col = BLACK;return true;}Node* cur = _root;Node* parent = nullptr;while (cur){if (cur->_kv.first < kv.first){parent = cur;cur = cur->_right;}else if (cur->_kv.first > kv.first){parent = cur;cur = cur->_left;}else{return false;}}cur = new Node(kv);//插入新节点cur->_col = RED;if (parent->_kv.first < kv.first){parent->_right = cur;}else{parent->_left = cur;}cur->_parent = parent;//当父亲不为空且父亲是红色的时候,关键是看叔叔,分两种情况:1.叔叔存在且是红。2.叔叔不存在/存在且是黑while (parent && parent->_col == RED){Node* grandfather = parent->_parent;if (parent == grandfather->_left)//叔叔在爷爷的右边{Node* uncle = grandfather->_right;//1.叔叔存在且是红。p变黑,u变黑,g变红。如果g是根再次变黑,否则继续向上更新。if (uncle && uncle->_col == RED){parent->_col = uncle->_col = BLACK;grandfather->_col = RED;cur = parent;//继续向上更新parent = cur->_parent;}//2.叔叔不存在/存在且是黑else{if (cur == parent->_left)//单旋{//     g                 p//   p   u------>     c    g// c                          uRotateR(grandfather);parent->_col = BLACK;grandfather->_col = RED;}else//双旋{//      g                 g            c//   p     u    ->      c    u   ->  p     g//      c             p                        uRotateL(parent);RotateR(grandfather);cur->_col = BLACK;grandfather->_col = RED;}break;}}else//叔叔在爷爷的左边{Node* uncle = grandfather->_left;// 叔叔存在且为红,-》变色即可if (uncle && uncle->_col == RED){parent->_col = uncle->_col = BLACK;grandfather->_col = RED;// 继续往上处理cur = grandfather;parent = cur->_parent;}else // 叔叔不存在,或者存在且为黑{// 情况二:叔叔不存在或者存在且为黑// 旋转+变色//      g//   u     p//            cif (cur == parent->_right){RotateL(grandfather);parent->_col = BLACK;grandfather->_col = RED;}else{//		g//   u     p//      cRotateR(parent);RotateL(grandfather);cur->_col = BLACK;grandfather->_col = RED;}break;}}}_root->_col = BLACK;return true;}void RotateR(Node* parent)//右旋{Node* subL = parent->_left;Node* subLR = subL->_right;parent->_left = subLR;if (subLR)subLR->_parent = parent;subL->_right = parent;Node* ppNode = parent->_parent;parent->_parent = subL;if (parent == _root){_root = subL;_root->_parent = nullptr;}else{if (ppNode->_left == parent){ppNode->_left = subL;}else{ppNode->_right = subL;}subL->_parent = ppNode;}}void RotateL(Node* parent)//左旋{Node* subR = parent->_right;Node* subRL = subR->_left;parent->_right = subRL;if (subRL)subRL->_parent = parent;subR->_left = parent;Node* ppNode = parent->_parent;parent->_parent = subR;if (parent == _root){_root = subR;_root->_parent = nullptr;}else{if (ppNode->_right == parent){ppNode->_right = subR;}else{ppNode->_left = subR;}subR->_parent = ppNode;}}bool IsBalance()//判断是否平衡,满足规则。{if (_root->_col == RED){return false;}int refNum = 0;Node* cur = _root;while (cur)//先找一条路劲计算黑色节点个数,与其他比较。{if (cur->_col == BLACK){++refNum;}cur = cur->_left;}return Check(_root, 0, refNum);}private:bool Check(Node* root, int blackNum, const int refNum)//refNum先找一个参考值计算黑色节点的个数。{if (root == nullptr){if (refNum != blackNum){cout << "存在黑色节点的数量不相等的路径" << endl;return false;}return true;}if (root->_col == RED && root->_parent->_col == RED){cout << root->_kv.first << "存在连续的红色节点" << endl;return false;}if (root->_col == BLACK){blackNum++;}return Check(root->_left, blackNum, refNum)&& Check(root->_right, blackNum, refNum);}void _InOrder(Node* root){if (root == nullptr){return;}_InOrder(root->_left);cout << root->_kv.first << ":" << root->_kv.second << endl;_InOrder(root->_right);}private:Node* _root = nullptr;
};

文章转载自:

http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://00000000.cyyhy.cn
http://www.dtcms.com/wzjs/618412.html

相关文章:

  • 公司网站建设与维护方案广州专业的网站推广工具
  • 做视频网站盈利多少公众号微信商城
  • 网站飘窗怎样做城乡建设主管部门官方网站
  • 网站的网络推广策略有哪些做资讯的网站
  • 怎样做公司网站介绍广告公司简介文案
  • 厦门专业网站设计公司网站建设精准精细快速
  • 海外域名提示风险网站吗网站建设公司销售前景
  • 网站建设公司的介绍云虚拟主机做视频网站
  • 家禽养殖公司网站怎么做北京互联网公司招聘
  • 国内优秀的网站注册一个公司网站的费用
  • 襄阳做网站比较有实力的公司土巴兔装修平台电话
  • 做模板网站的利与弊做旅游计划上哪个网站
  • 网站建立的步骤网站建设智推网
  • 江苏城乡与住房建设部网站一个网站做两个语言模板可以吗
  • 各大门户网站用什么做的discuz做资讯网站
  • 编程网站ide做的比较好的深圳网站建设推荐q479185700顶上
  • 重庆自适应网站建设好看简洁的logo
  • 单位网站建设情况汇报电子商务网站建设与管理的总结
  • 徐州网站建设优化贵州建设职业技术学院网站查成绩
  • 网站开发的项目背景中信建设有限责任公司 乔锋 电话
  • 北京贸易公司网站制作wordpress用户密码
  • 河北省建设中心网站奥运网站模板
  • 人社局网站建设管理工作总结wordpress主题搭建
  • 西宁网络信息 网站建设建设银行网站怎么不可登入
  • 天津制作企业网站报价中国空间站视频
  • 共享办公wework萧山区seo关键词排名
  • 禅城建网站官方网站建设合作协议
  • 怎样购买网站程序中企动力做网站多少钱
  • 机关局域网网站建设wordpress如何添加首页
  • 网站运营适合什么样的人做seo案例分享