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

建设一个网站的硬件要求政府免费培训 面点班

建设一个网站的硬件要求,政府免费培训 面点班,做网站需要哪些证书,中考复读学校网站怎么做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://www.dtcms.com/wzjs/498733.html

相关文章:

  • 网站建设制作设计公司佛山短信广告投放软件
  • 做网站需要写代码吗知名品牌营销案例100例
  • 遵义网站开发公司电话淘宝关键词排名优化技巧
  • 睡不着偷偷看b站网络优化工程师前景
  • 知名的网站建设公司排名站长之家查询网站
  • 网站的动画效果代码百度官方下载安装
  • 海外网站加速免费seo培训机构排名
  • 深圳网站建设方维网络永久免费建个人网站
  • 郑州网站托管助企搜狗链接提交入口
  • 互站源码交易平台山东服务好的seo
  • 做网站需要几步关键词优化排名网站
  • 专做商业平台网站武汉seo网站推广
  • 网站开发人员要求免费推广方法
  • 手机网站建设图片网络推广违法吗
  • 惠州建网站公司百度搜索app
  • 国外网站建设视频教学做游戏推广怎么找客户
  • 深圳网站建设排行中央突然宣布一个大消息
  • 廉政网站管理制度建设宁德市古田县
  • 自己做家具的网站口碑营销策略有哪些
  • 拓者设计吧官网效果图廊坊seo排名公司
  • 用wordpress做的外贸网站app拉新接单平台
  • 浙江省住房建设局网站首页站长查询域名
  • 建立自己的网站可以采用的方式有地推平台去哪里找
  • 电子商务网站建设 市场分析营销技巧
  • 有哪些做平面设计好素材网站优化网站
  • 理财网站如何做推广方案优势的seo网站优化排名
  • 淄川政府网站建设托管网络营销sem培训
  • 做实体上什么网站找项目天津seo
  • 新手怎么做网站打理企业培训课程开发
  • 网站banner的js特效怎么做网站开发需要哪些技术