标签:
一棵自平衡的二叉排序树(二叉搜索树)
生成二叉排序树的过程是非常容易失衡的,最坏的情况就是一边倒(只有右/左子树),这样会导致二叉树的检索效率大大降低(O(n))。
为了维持二叉树的平衡,有各种的算法,如:AVL,SBT,伸展树,TREAP ,红黑树等等。
红黑树需要满足5条性质:
- 节点非红即黑
- 根节点是黑色
- 所有NULL结点称为叶子节点,且认为颜色为黑
- 所有红节点的子节点都为黑色,一条路径上不能出现相邻的两个红色结点
- 从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点
比如:
衍生性质:树上的最长路径不可能会大于2倍最短路径。
解释:因为第1条该树上的节点非红即黑,由于第4条该树上不允许存在两个连续的红节点,那么对于从一个节点到其叶子节点的一条最长的路径一定是红黑交错的,那么最短路径一定是纯黑色的节点;而又第5条从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点,这么来说最长路径上的黑节点的数目和最短路径上的黑节点的数目相等!而又第2条根结点为黑、第3条叶子节点是黑,那么可知:最长路径<=2*最短路径
注:红黑树不是平衡二叉树,区别:
1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。
2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。平衡二叉树又被称为AVL树(有别于AVL算法),且具有以下性质:它是一
棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
构造与调整方法平衡二叉树的常用算法有红黑树、AVL、Treap等。
最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1。
这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。
左旋、右旋、着色
首先,为了保证根节点到叶节点黑节点数目相同,每次插入的都是红节点。
如果有两个红节点相邻,那么需要进行调整:
情形1:
树为空,直接插入根结点的位置,把节点颜色改为黑
情形2:
插入点的父节点为黑,那么不会破坏任何性质,直接插入。
下面讨论插入点父节点为红情况,共三种,插入点为N:
情形3:
如图换颜色,递归向上插入G
情形4:
情形5(转成情形4):
我们删除一个节点,实际上删除的是叶节点(替代点)。
首先将删除点和替代点交换,然后删除替代点。
替代点是被删除点中序遍历的上一个或下一个节点,所以替代点一定是一棵子树的最左子或最右子。
所以,替代点一定至少有一个子节点是叶子节点。
五种情形,删除的是N:
情形1:
这时候删除N,需要进一步递归删除(P为父元素根,删除N的操作),因为破环了每条路径黑节点数目相同。
情形2:
情形3:
情形4:
情形5:变为情形4
标签:
原文地址:http://blog.csdn.net/zly9923218/article/details/51036259