1. 程式人生 > 其它 >Linux核心中的紅黑樹

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