1.左子树上所有结点的值均小于或等于它的根结点的值。
2.右子树上所有结点的值均大于或等于它的根结点的值。
3.左、右子树也分别为二叉排序树
二分查找的思想:查找所需的最大次数等同于二叉查找树的高度
在插入节点的时候,也是通过一层层的比较大小,找到新节点适合插入的位置
二叉树的缺陷:它主要体现在新插入节点的时候:
(1)假设初始的二叉查找树只有三个节点,根节点值为9,左孩子值为8,右孩子值为12
(2)然后依次插入如下五个节点:7,6,5,4,3。依照二叉查找树的特性,结果会变成什么样呢?、
(3) 9 右孩子为12,左孩子依次为7.6.5.4.3
(4)存在的问题:这样的形态虽然也符合二叉树的特点,但是查找的特性大打折扣,几乎变成了线性的
(5)如何解决二叉查找树多次插入新节点而导致的不平衡呢?红黑树的由来。
红黑树的简介:
是一种平衡的二叉查找树,除了符合二叉查找树的基本特性外,它还具有以下的特性:
1.节点是红色或黑色。
2.根节点是黑色。
3.每个叶子节点都是黑色的空节点(NIL节点)。
4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
由于存在这些规则,才保证了红黑树的自平衡,红黑树从根到叶子的最长路径不会超过最短路径的2倍。
当插入删除节点的时候,红黑树的规则有可能被打破,为了防止规则被打破调整的方法有俩种:变色和旋转。其中旋转包括左旋转和右旋转
变色:
为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色(变色的时候一定要符合红黑树的五个特性)。
左旋转:
逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子
右旋转:
顺时针旋转红黑树的两个节点,使得父节点被自己的左孩子取代,而自己成为自己的右孩子。
红黑树的实际应用:集合TreeSet和TreeMap的底层实现都是红黑树实现的。在java8中HashMap也用到了红黑树