Red Black Tree - 红黑树


特性

红黑树比AVL树的实际性能更好,插入/删除节点后红黑树所需的调整操作次数约为次,而AVL树需要次。尽管它们的插入/删除/查找时间复杂度都是

在作者的PC机上,对红黑树和AVL树进行测试(节点最多为8192个,重复最多8192次,详见代码),结果AVL树通过所有测试需要72秒,红黑树只需要59秒,

除了基本的二叉查找树属性,红黑树还拥有以下特性:

节点是红色或黑色的;

根节点是黑色的;

叶子节点的左右孩子节点都为节点,节点是黑色的;

红色节点的左右孩子节点都是黑色的;

根节点到任意节点途中经过的黑色节点的数量相同;

RedBlackTree1.png

红黑树是一种可伸缩的金字塔形状,其中的黑色节点严格保持金字塔形状,而红色节点就像弹簧一样。任意分支上的红色节点和黑色节点数量(包括空节点)总满足

插入

红黑树的插入过程与AVL树类似,按照二分查找找到适合的位置插入新节点,然后从沿着父节点向上对每个节点检查,若红黑树的属性被破坏则通过以下规则调整自己。下面是所有需要调整的情况:

RedBlackTree2.png

RedBlackTree3.png

RedBlackTree4.png

RedBlackTree5.png

RedBlackTree6.png

上面五种情况中,若处于情况则按照进行旋转和重新染色,再从节点开始下一次检查(跳过了一个节点);若处于情况则按照进行旋转和染色(这四种旋转和AVL Tree的旋转操作其实是一样的),之后该树必然满足红黑树属性,不必继续向上依次检查所有节点,停止检查,插入结束。

删除

红黑树删除前半部分与AVLTree、BinarySearchTree相同,这里不再赘述。删除完节点之后,递归向上,按照种调整情况进行调整即可。


Red Black Tree


源码

RedBlackTree.h

RedBlackTree.cpp

测试

RedBlackTreeTest.cpp