这里再来复习一下二叉树的概念:数组
理解了这些,咱们这节要学习的内容就是有关于二叉查找树以及有关红黑树。数据结构
从这个名字,能够简单理解一下,他是为了解决什么被发明出来的。固然是查找了。由于名字自带查找。哈哈 开个玩笑。其实就是为了方便查找学习
特征:左边子元素的值必定 <= 根节点
特征:右边子元素的值必定 >= 根节点code
这就是一个典型的二叉查找树,好比咱们查找一个2
的元素位置blog
二叉查找树使用二分法的思想,将元素的位置惟一指定出来。查找最大次数=二叉树高度。get
这么nice的二分法查找树,也不是没有缺陷的,世界上没有任何一个完美的东西。
因此,它的缺陷就是:若是咱们的元素所有都是小于根节点的,那就变成这样的一个东西了。class
这样,如果查找一个关于7
的元素,那么直接乱套了。直接和线性的数组就没有区别了。仍是须要一个个遍历。file
为了解决这种缺陷,下面这个东西出现了!二叉树
红黑树,是一种自我平衡的二叉查找树,说白了就是比二叉查找树更加Plus
HashMap 再JDK 8当中。若链表长度超过8,则转换为红黑树。这也是一种特别好用的数据结构。因此说。很重要
遍历
黑色的空节点
在插入一个新值的时候,可能会使红黑树违反上面的5条规则,这个时候须要进行变色和旋转,咱们逐一来说解。
假设向当前红黑树插入一个 21
节点。
21比22小,因此只能放到22左边的位置。这里问题也就来了:
红色
的 而不能是黑色?叶子节点必须是黑色空节点,因此,红色节点下必须有两个黑色节点,因此该节点必须是红色。
固然,又往上面看的话,你就会发现:22 是红色节点,红色节点必须包含两个黑色节点? 这又冲突了。怎么办?
这里尝试将22 节点变为黑色。这样的话,下面的规则知足了。可是从17号元素出发。到叶子节点。左边的线路有三个黑色节点,左边只有两个。
从任意节点到每一个叶子节点路径都都包含相同数目的黑色节点
为了规则的完整性,继续变色。将25号元素变成红色
这时候尚未结束,由于
每一个红色节点下面都有两个黑色节点
这样才算彻底符合规则规范。
这里理解起来会很吃力。我先画个图。来理解这里面涉及到的内容。
最简单的方式是将子节点的左节点断开,挂到父节点上,翻转一下位置便可。
断开子节点的左边节点。
将断开的这个节点挂到父节点上。
旋转位置
很好理解吧!
断开子节点的右孩子。
挂到父节点上
旋转位置。
往那边旋转,就断开本身的那边的孩子,而后挂到父级,将节点变换一下位置便可。
其实红黑树的内容了解这么多就能够了。也不必必须钻牛角尖。只须要懂得红黑树这种自平衡的主体思想便可。