二叉查找树
二叉查找树(BST)的特性
1.左子树上所有节点的值均小于或等于它的根节点。
2.右子树上所有节点的值均大于或等于它的根节点。
3.左、右子树也分别为二叉排序树。
以上这棵树就是一个典型的二叉查找树
二叉查找树查询
查询节点12:
第一步:查看根节点10
第二步:因为12 > 10,故查看右子树16:
第三步:由于12 < 16,故查看左子树13:
第四步:由于12 < 13,故查看左子树12,成功查询到结果。
即是通过二分查找查询到了结果。
二叉查找树的缺陷
但二叉查找树是具有局限性的,主要体现在它的时间性能上:
在某些情况下,二叉查找树可能退化为链表,请看下面的例子:
如有数值1、3、5、6、7、8、9
那么它可能是这样的:
情况一
也可能是这样的:
情况二
如上图两种情况,情况一 的时间复杂度为O(lgn),但 情况二 的时间复杂度达到了O(n)。
情况二已经成为了一个链表,性能已大打折扣。
红黑树
为了解决二叉查找树插入新节点时可能造成的不平衡问题,于是便有了 红黑树 的概念。
红黑树的定义
红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它在1972年由鲁道夫·贝尔发明,被称为"对称二叉B树",它现代的名字源于Leo J. Guibas和Robert Sedgewick于1978年写的一篇论文。红黑树的结构复杂,但它的操作有着良好的最坏情况运行时间,并且在实践中高效:它可以在 O(log n) 时间内完成查找,插入和删除,这里的 n 是树中元素的数目。
红黑树的特性
1.节点是红色或黑色。
2.根是黑色。
3.所有叶子都是黑色(叶子是NIL节点)。
4.每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
5.从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
以上这些约束条件保证了红黑树的关键特性,即从艮到叶子的最长可能路径不多于最短可能路径的两倍。从而保证了红黑树在最坏的情况下都是高效的。
红黑树的自平衡
当插入或删除节点时,红黑树的平衡就可能被打破。
变色
旋转
插入
当要插入新节点时,首先以二叉查找树的方法增加节点并标记它为 红色。