红黑树:一种 自平衡-二叉-搜索树
二叉树,按中序遍历后为一递增数组,自平衡意味着树的高度有一个上限,对于红黑树,其为2log(n+1),所以时间复杂度为最差为Olog(n)。
赋予二叉搜索树自平衡特性的方法有多种,红黑树通过一下4条约束实现自平衡:
其中根节点为黑色。
红黑树的搜索与二叉搜索树无异,但是插入和删除可能会违背上述四条原则。需要用到左旋右旋操作。
左旋右旋上图,可以看到左旋右旋本身不改变二叉搜索树的特性,旋转后必要时改变节点的颜色可消除插入或者删除带来的红冲突和黑冲突,有时红黑树的重新平衡需要迭代进行
Linux内核中的红黑树数据结构定义在:
linuxKernel_2_6/linux-2.6.11/lib/rbtree.c linuxKernel_2_6/linux-2.6.11/include/linux/rbtree.h
zai红黑树在Linux内核中有多种应用,如进程线性区数据结构等等。
Linux红黑树节点不带有value值,其实现原理与Linux中链表类似,每个节点作为某类数据结构的成员,如vm_area_struct线性区结构体,插入时都是通过红黑树节点找到相应结构体的指针,然后进行相应操作,每一次插入或者删除后,都需要重新“平衡红黑树”以保持红黑树的四条准则。
红黑树的插入和删除操作较为复杂,分为多种情况,详情参考维基百科
https://en.wikipedia.org/wiki/Red%E2%80%93black_tree#req4