Linux内核中的红黑树

红黑树:一种 自平衡-二叉-搜索树


二叉树,按中序遍历后为一递增数组,自平衡意味着树的高度有一个上限,对于红黑树,其为2log(n+1),所以时间复杂度为最差为Olog(n)。

赋予二叉搜索树自平衡特性的方法有多种,红黑树通过一下4条约束实现自平衡:

  1. Every node is either red or black.
  2. All NIL nodes (figure 1) are considered black.
  3. A red node does not have a red child.
  4. Every path from a given node to any of its descendant NIL nodes goes through the same number of black nodes.

其中根节点为黑色。

红黑树的搜索与二叉搜索树无异,但是插入和删除可能会违背上述四条原则。需要用到左旋右旋操作。

左旋右旋上图,可以看到左旋右旋本身不改变二叉搜索树的特性,旋转后必要时改变节点的颜色可消除插入或者删除带来的红冲突和黑冲突,有时红黑树的重新平衡需要迭代进行


Linux内核中的红黑树数据结构定义在:

1
2
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

 

 

 

posted @   我叫平沢唯  阅读(528)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示