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

华为等五家公司南昌关键词优化平台

华为等五家公司,南昌关键词优化平台,做app开发,假冒建设银行网站目录 一.红黑树的概念二.插入操作三.与AVL树的比较 一.红黑树的概念 在之前的学习中#xff0c;我们了解了二叉搜索平衡树#xff0c;AVL树通过控制每个结点中的平衡因子的绝对值不超过1#xff0c;实现了一个高性能的树。而相较于AVL的高度平衡#xff0c;红黑树觉得AVL为… 目录 一.红黑树的概念二.插入操作三.与AVL树的比较 一.红黑树的概念 在之前的学习中我们了解了二叉搜索平衡树AVL树通过控制每个结点中的平衡因子的绝对值不超过1实现了一个高性能的树。而相较于AVL的高度平衡红黑树觉得AVL为了平衡也付出了代价插入和删除时进行了多次旋转所以红黑树在控制平衡上面没有这么严格只是要求最长路径不超过最短路径的二倍。那红黑树又是如何控制实现的呢接下来了解一下红黑树的性质 每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的则它的两个孩子结点是黑色的(任何路径上没有连续两个红结点)对于每个结点从该结点到其所有后代叶结点的简单路径上均 包含相同数目的黑色结点每个叶子结点都是黑色的(此处的叶子结点指的是空结点也称为NIL结点 二.插入操作 在我们了解红黑树的性质后就需要分析相关代码看他如何实现的。首先我们看红黑树结点的定义: 因为map和set的底层使用红黑树实现了为了之后方便这里红黑树用了两个模板参数。 #include iostreamusing namespace std;enum Colour {RED, BLACK };templateclass K,class V class RBTreeNode { public:RBTreeNodeK, V* _left;RBTreeNodeK, V* _right;RBTreeNodeK, V* _parent;pairK, V _kv;Colour _col;RBTreeNode(const pairK,V kv):_left(nullptr),_right(nullptr),_parent(nullptr),_kv(kv),_col(RED){} };结点定义中与AVL树差距不大只是多了个用枚举定义的参数用来指定是红结点还是黑结点。接下来讲解重点的插入操作 首先因为红黑树也是二叉搜索树所以要满足二叉搜索树的基本性质再者是我们插入的结点的颜色先置为什么能让后面的调整更方便呢。如果黑色需要在后面依据性质4调整插入红色的话依据性质3调整。明显是4更为复杂所以我们插入颜色为红色。 bool Insert(const pairK, V kv) {if(_root nullptr){_root new Node(kv);_root-_col BLACK;return true;}Node* cur _root;Node* parent nullptr;while (cur){if (kv.first cur-_kv.first){parent cur;cur cur-_right;}else if (kv.first cur-_kv.first){parent cur;cur cur-_left;}else{return false;}}cur new Node(kv);cur-_col RED;if (parent-_kv.first cur-_kv.first){parent-_left cur;}else{parent-_right cur;}cur-_parent parent;///开始调整颜色///开始调整颜色_root-_col BLACK;return true; }上段代码是不涉及调整颜色只保证二叉搜索树性质。下面开始分类讨论研究如何调整颜色。 如上图所示插入的cur结点是红色这时出现了连续的两个红结点所以就要进行调整。如果parent结点是黑色则不需要调整。我们把10结点和20结点称为parent和grandfather结点22为uncle结点。 1.当uncle结点为红色时变色然后继续向上调整 2.当uncle结点不存在时或者为黑时的处理方式相同 完整代码如下: bool Insert(const pairK, V kv){if(_root nullptr){_root new Node(kv);_root-_col BLACK;return true;}Node* cur _root;Node* parent nullptr;while (cur){if (kv.first cur-_kv.first){parent cur;cur cur-_right;}else if (kv.first cur-_kv.first){parent cur;cur cur-_left;}else{return false;}}cur new Node(kv);cur-_col RED;if (parent-_kv.first cur-_kv.first){parent-_left cur;}else{parent-_right cur;}cur-_parent parent;while (parent parent-_col RED){Node* grandfather parent-_parent;if (parent grandfather-_left){Node* uncle grandfather-_right;//叔叔存在且为红if (uncle uncle-_col RED){parent-_col uncle-_col BLACK;grandfather-_col RED;cur grandfather;parent cur-_parent;}else // 叔叔不存在或者为黑都是旋转变色{if (cur parent-_left){RevoR(grandfather);parent-_col BLACK;grandfather-_col RED;}else{RevoL(parent);RevoR(grandfather);cur-_col BLACK;grandfather-_col RED;}}}else{Node* uncle grandfather-_left;//叔叔存在且为红if (uncle uncle-_col RED){parent-_col uncle-_col BLACK;grandfather-_col RED;cur grandfather;parent cur-_parent;}else // 叔叔不存在或者为黑都是旋转变色{if (cur parent-_left){RevoR(parent);RevoL(grandfather);cur-_col BLACK;grandfather-_col RED;}else{RevoL(grandfather);parent-_col BLACK;grandfather-_col RED;}}}}_root-_col BLACK;return true;}void RevoL(Node* parent){Node* cur parent-_right;Node* curleft cur-_left;parent-_right curleft;//无论curleft是否为空都要执行这一步if (curleft){curleft-_parent parent;}cur-_left parent;Node* ppnode parent-_parent;parent-_parent cur;if (parent _root){_root cur;cur-_parent nullptr;}else{if (ppnode-_left parent){ppnode-_left cur;}else{ppnode-_right cur;}cur-_parent ppnode;}}void RevoR(Node* parent){Node* cur parent-_left;Node* curright cur-_right;parent-_left curright;if (curright){curright-_parent parent;}cur-_right parent;Node* ppnode parent-_parent;parent-_parent cur;if (_root parent)//等价于 ppnode nullptr{_root cur;cur-_parent nullptr;}else{cur-_parent ppnode;if (ppnode-_left parent){ppnode-_left cur;}else{ppnode-_right cur;}}}三.与AVL树的比较 红黑树和AVL树的插入效率O(logN)只是红黑树不像AVL追求如此平衡所以旋转次数会少并且实现也较简单。所以在实践中大都使用红黑树。之后我们还是使用红黑树模拟实现map和set。
http://www.dnsts.com.cn/news/190710.html

相关文章:

  • 茌平建设局网站开发一个小程序一般需要多少钱呢
  • 宣威市网站建设站酷网免费素材图库官网
  • 呼和浩特装修网站织梦网站怎么把index.html去掉
  • 娱乐网站 建站软件怎样制作网站
  • 百度网站收入天津 网站设计公司
  • 小型项目外包网站中国建筑网官网证书查询
  • 色块布局网站首页模板建筑培训课程有哪些
  • 网站建设方案的重要性青岛模板建站多少钱
  • 中华智能自建代理网站小程序开发定制开发
  • 博尔塔拉州大型网站建设普洱在百度上做网站的
  • 免费网站怎么申请主题资源网站建设步骤
  • 张家口网站建设价格wordpress展示产品
  • 外贸网站教程哈尔滨网站建设服务
  • 直接找高校研究生做网站行吗个人免费发布房源信息
  • wordpress 导航网站模板下载维护网站建设空间出租
  • 产品推广方案吉林seo策略
  • 天津模板建站定制网站青海省住房城乡建设厅网站首页
  • 前端网站建设网页设计素材的制作与收集
  • 工程科技 网站设计可做百度百科参考资料的网站
  • 佟年帮韩商言做网站是第几集软件开发公司起名
  • 怎么用自己主机做网站_python 做爬虫网站
  • 网站做成app的软件在线做venn图网站
  • 小程序与手机网站区别河北省建设厅办事大厅网站
  • 公司o2o网站建设wap网站开发价钱
  • 沈阳工伤保险做实网站网站建设的前途
  • 旅游网站建设备案wordpress菜单链接地址
  • 设计师 必备的网站定西市住房和城乡建设局网站
  • 上蔡做网站建站之星网站模板商城
  • 专门找人做软件的网站夏天做哪个网站致富
  • 如何建设游戏网站移动网站开发工具