平衡二叉树以后提出的概念,就叫红黑树。因为平衡二叉排序树插入经常都要 左旋,右旋,影响效率,但又依然需要类似特性,就产生了红黑树。目的:1.破除高度差为1的定义,让它不要那么频繁旋转2.代码实现比较简单些。
红黑树的五个特点(要求):
1.节点是红或黑
2.根必须是黑的
3.空叶子默认是黑的
4.红的孩子必须是黑的。也就默认了从根出发,不存在连续的红色结点。
5.从根出发到所有空叶子结点(包含空叶子结点)的所有路径,黑色结点数量相等。
如图,也就意味着最长的路径超不过2倍最短,这样一来时间复杂度也是o(logn)。
建树:以先插入,再染色为原则
情况一:插入位置是根,直接染黑。如果不在根上,那就必有父亲,往下看。
情况二:父亲是黑,也是直接插入,无需操作。
情况三:父亲是红,叔叔也是红。把爷G染成红,把父和叔(P、U)染成黑。这个图里u下面应该有方框,代表空叶子结点。
情况四:父亲是红,叔叔是黑。这是最复杂的情况,如下图。
其实情况四还要分为四种情况,取决于n是否在p,g中。
四种情况分别对应:G右旋,G左旋,P左旋G右旋,P右旋G左旋。就和平衡二叉树的插入差不多了。
手撕代码以后再写。