二叉查找树、红黑树

数据结构可以划分为物理结构和逻辑结构。二叉树属于逻辑结构,可以通过多种物理结构来表达如链式存储结构、数组

二叉查找树(BST)具备什么特性呢?

1.子树上所有结点的值均小于或等于它的根结点的值。

2.子树上所有结点的值均大于或等于它的根结点的值。

3.左、右子树也分别为二叉排序树。

下图中这棵树,就是一颗典型的二叉查找树:

 

 查找数据所需的最大次数等于二叉树的高度

二叉树若插入的数据都小于根节点数据时就会失去平衡,效率就会大打折扣。这时候红黑树就应运而生。红黑树是一种自平衡的二叉查找树,除了拥有二叉查找树的特性外还具有下列附加属性:

1.节点是红色或黑色。

2.根节点是黑色。

3.每个叶子节点都是黑色的空节点(NIL节点)。

4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

下图中这棵树,就是一颗典型的红黑树:

 红黑树从根节点到叶子的最长路径不会超过最短路径的两倍,当插入或者删除节点时红黑树的规则可能会被打破这时候就需要调整来维持我们的规则

调整的方式有两种 变色 和 旋转  而旋转又分为 左旋转 和 右旋转 有时候需要结合使用

变色:为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。

左旋转:逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。说起来很怪异,大家看下图:

图中,身为右孩子的Y取代了X的位置,而X变成了自己的左孩子。此为左旋转

右旋转:顺时针旋转红黑树的两个节点,使得父节点被自己的左孩子取代,而自己成为自己的右孩子

红黑树应用比较多:TreeSet TreeMap 在JAVA8中连HashMap也用到了红黑树

参考:《漫画算法》 参考公众号:程序员小灰

原文地址:https://www.cnblogs.com/leifonlyone/p/12609481.html