二叉搜索树的概念
二叉搜索树又称为二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
- 若它的左子树不为空,则左子树上所有结点的值都小于根结点的值。
- 若它的右子树不为空,则右子树上所有结点的值都大于根结点的值。
- 它的左右子树也分别是二叉搜索树。
例如,下面就是一棵二叉搜索树:
平衡二叉树
平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
红黑树定义和性质
红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:
- 性质1:每个节点要么是黑色,要么是红色。
- 性质2:根节点是黑色。
- 性质3:每个叶子节点(NIL)是黑色。
- 性质4:每个红色结点的两个子结点一定都是黑色。
- 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
红黑树并不是一个完美平衡二叉查找树,从图1可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点(性质5)。所以我们叫红黑树这种平衡为黑色完美平衡。
前面讲到红黑树能自平衡,它靠的是什么?三种操作:左旋、右旋和变色。
- 左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。如图3。
- 右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。如图4。
- 变色:结点的颜色由红变黑或由黑变红。
图3 左旋
图4 右旋
AVL和红黑树的比较
但很多地方都在这么用。两者的比较如下
平衡二叉树类型 | 平衡度 | 调整频率 | 适用场景 |
AVL树 | 高 | 高 | 查询多,增/删少 |
红黑树 | 低 | 低 | 增/删频繁 |
- 空间开销。
- 实现难度。
- 时间开销。
- 查找开销
- 调整开销
最坏时间开销的比较
- 就查找而言,两者都是对数级别的,但红黑树的系数更大一点。举个可以感知的例子,在一千万个节点的时候,AVL树保证最多需要比较34次一定能查出结果,而红黑树则最多需要比较47次。
- 插入调整(及变色)和查找类似,AVL树拥有着系数上的优势。然而删除调整时构造的红黑树竟然是一颗满二叉树,这种情况下两者的优势又反转了,可谓是各有千秋。
- 至于插入旋转大家最多都是两次,而删除旋转红黑树保证最多三次,而AVL树则可能是对数级别的。