紅黑樹的插入操作詳解

2021-10-02 02:29:27 字數 2610 閱讀 9927

每個節點或者是黑色節點,後者是紅色節點

根節點是黑色節點

每個葉子節點(null節點)是黑色節點

若乙個節點是紅色節點,那麼它的所有子節點都是黑色節點

從任意乙個非葉子節點出發,到達葉子節點,其中所有路徑經過的黑色節點的數目是相同的

以上5個特點決定紅黑樹中,從乙個非葉子節點出發到達葉子節點,其中最長路徑的長度不超過最短路徑長度的兩倍(由第5條性質,再加上第4條性質可以理解為紅色節點不能連續出現,那麼可以得出不超過兩倍的結論)。

這裡插入操作借鑑一篇部落格的內容,作者寫的非常好。

首先約定插入的新節點的顏色都為紅色。然後將該節點插入的按二叉查詢樹的規則插入到樹中。這個節點後文稱為n。

根節點為空。這種情況,將n的顏色改為黑色即可。

n的父節點為黑色。這種情況不需要做修改。

n的父節點為紅色(根據性質3,n的祖父節點必為黑色)。

其中,第3種情況需要詳細討論:

public class redblacktreeinsert

} public static boolean isred(node node)

public static boolean isblack(node node)

public static node insert(node root,int value)

public static void leftroate(node node)

public static void rightroate(node node)

public static node adjust(node root,node n)

public static void print(node root)

public static void main(string args);

node root=null;

for(int i=0;ivalue)

else if(r.valuevalue)

else//上面是插入乙個新的結點的**

return adjust(root,n);//插入後的調整操作

}

//這裡是調整操作的完整**

public static node adjust(node root,node n)

if(n.parent.parent==null)//當前節點沒有祖父節點,返回根節點

return n.parent;

else

else

n.parent.color=black;

n.parent.parent.color=red;

if(n.parent.parent==root)

else

rightroate(n.parent.parent);} }

else

else

n.parent.color=black;

n.parent.parent.color=red;

if(n.parent.parent==root)

else

leftroate(n.parent.parent); }}

return root;//旋轉後根節點不發生變化的情況

} }}

//左旋操作的完整**

public static void leftroate(node node)

//右旋操作的完整**

public static void rightroate(node node)

//print函式的完整**,用於按層遍歷紅黑樹

public static void print(node root)

if(n.color==black) str="black(";

else str="red(";

str+=n.value;

str+=")";

system.out.println(str);

if(n.left!=null) queue.offer(n.left); else queue.offer(new node(-1));

if(n.right!=null) queue.offer(n.right); else queue.offer(new node(-1));

} }

最終的輸出結果:

最終結果如上圖所示。

紅黑樹筆記 紅黑樹的插入操作

紅黑樹的插入操作可以在o logn 的時間內完成。開始插入節點的時候和二叉查詢樹一樣,只需要最後將插入的節點著成紅色,為了保證紅黑樹的性質,需要通過rb insertfixup函式來調整該節點,對其重新著色並旋轉。下面先呼叫rb insert 函式將乙個節點插入到紅黑樹中,同樣先上偽 rb inse...

紅黑樹的插入操作

紅黑樹插入時的情況 紅黑樹是有序樹,在插入乙個節點時,插入的結點一定會成為葉結點,且插入的結點一定要是紅色的。那麼,插入時就可能會產生顏色衝突,即插入結點 n 和 它的父節點 p 的顏色都是紅色。如果 p 是黑色,沒有衝突,直接插入就好。顏色衝突問題解決 要明確,在紅黑樹插入節點 n 時,如果出現顏...

紅黑樹(插入)

紅黑樹的插入操作相對刪除操作比較簡單。紅黑樹要滿足 任一節點至null的任何路徑,所含黑節點數必須相同。所以,為了滿足此性質,插入節點應該為紅色。如果插入節點的父親為黑色,則不需要進行調整,若為紅色,有三種情況需要討論。1.父節點為紅色,叔節點為紅色 對於這種情況,同時改變父 叔節點顏色為黑色,並將...