博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
红黑树(Red-Black tree)
阅读量:4565 次
发布时间:2019-06-08

本文共 879 字,大约阅读时间需要 2 分钟。

红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性。同时红黑树更是一颗自平衡的排序二叉树。

我们知道一颗基本的二叉树他们都需要满足一个基本性质–即树中的任何节点的值大于它的左子节点,且小于它的右子节点。按照这个基本性质使得树的检索效率大大提高。我们知道在生成二叉树的过程是非常容易失衡的,最坏的情况就是一边倒(只有右/左子树),这样势必会导致二叉树的检索效率大大降低(O(n)),所以为了维持二叉树的平衡,大牛们提出了各种实现的算法,如:,,, ,等等。

平衡二叉树必须具备如下特性:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。也就是说该二叉树的任何一个等等子节点,其左右子树的高度都相近。

红黑树顾名思义就是节点是红色或者黑色的平衡二叉树,它通过颜色的约束来维持着二叉树的平衡。对于一棵有效的红黑树二叉树而言我们必须增加如下规则:

  1. 每个节点都只能是红色或者黑色
  2. 根节点是黑色
  3. 每个叶节点(NIL节点,空节点)是黑色的。
  4. 如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

红黑树示意图如下:

上面的规则前4条都好理解,第5条规则到底是什么情况,下面简单解释下,比如图中红8到1左边的叶子节点的路径包含两个黑色节点,到6下面的叶子节点的路径也包含两个黑色节点。

但是在在添加或删除节点后,红黑树就发生了变化,可能不再满足上面的5个特性,为了保持红黑树的以上特性,就有了三个动作:左旋、右旋、着色。

下面来看下什么是红黑树的左旋和右旋:

对x进行左旋,意味着”将x变成一个左节点”

对y进行右旋,意味着”将y变成一个右节点”。

如果还是没看明白,下面找了两张左旋和右旋的动态图
ok,对二叉树、红黑树的概念有所了解后,我们来看下红黑树的两个主要逻辑添加和删除,看看TreeMap是怎么实现的。

转载于:https://www.cnblogs.com/duanxz/p/3564910.html

你可能感兴趣的文章
C#二维数组及其本质(转)
查看>>
hdu 2841 Visible Trees(容斥)
查看>>
html学习
查看>>
emacs学习(五)
查看>>
更多的结构化命令
查看>>
gulp教程之gulp-htmlmin(gulp-htmlmin压缩html,可以压缩页面javascript、css,去除页面空格、注释,删除多余属性等操作)...
查看>>
python统计一个文本中重复行数的方法
查看>>
大数据时代:数据即信用,信用即数据
查看>>
大数据的时代意义
查看>>
restful接口就是url嘛,通过http请求发起访问。那接口进行监控,就可以监控这个restful url嘛...
查看>>
MFC中字符串赋值出现“Error:“const char*”类型的实参与“LPCWSTR”类型的形参不兼容”错误的解决方法...
查看>>
hdu1540 区间合并+询问某点的最大连续块
查看>>
生成器和生成器函数以及各种推导式
查看>>
c#找不到类型或命名空间名称“Word”
查看>>
Oracle,第四周
查看>>
用BeautifulSoup简单爬取BOSS直聘网岗位
查看>>
2.13生成可控的随机数据集合 生成九个分布的直方图
查看>>
成员变量、局部变量和静态变量的区别 (转)
查看>>
图论总结
查看>>
《当我谈跑步时,我谈些什么》读后笔记
查看>>