Linux内核中的红黑树

2022/5/6 7:15:17

本文主要是介绍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内核中的红黑树数据结构定义在:

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

 

 

 



这篇关于Linux内核中的红黑树的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程