程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#與數據結構--樹論--紅黑樹(Red Black Tree)(上)(2)

C#與數據結構--樹論--紅黑樹(Red Black Tree)(上)(2)

編輯:關於C語言

紅黑樹的旋轉操作

紅黑樹的旋轉操作和AVL樹一樣,分為Ll 、RR、LR、RL四種旋轉類型,差別在於旋轉完成後改變的是結點的顏色,而不是平衡因子。旋轉動畫演示請參考AVL這篇文章中的Flash動畫:

http://www.cnblogs.com/abatei/archive/2008/11/17/1335031.Html 

紅黑樹上結點的插入

在討論紅黑樹的插入操作之前必須要明白,任何一個即將插入的新結點的初始顏色都為紅色。這一點很容易理解,因為插入黑點會增加某條路徑上黑結點的數目,從而導致整棵樹黑高度的不平衡。但如果新結點父結點為紅色時(如圖2所示),將會違返紅黑樹性質:一條路徑上不能出現相鄰的兩個紅色結點。這時就需要通過一系列操作來使紅黑樹保持平衡。

為了清楚地表示插入操作以下在結點中使用“新”字表示一個新插入的結點;使用“父”字表示新插入點的父結點;使用“叔”字表示“父”結點的兄弟結點;使用“祖”字表示“父”結點的父結點。插入操作分為以下幾種情況:

1、黑父

如圖3所示,如果新點的父結點為黑色結點,那麼插入一個紅點將不會影響紅黑樹的平衡,此時插入操作完成。紅黑樹比AVL樹優秀的地方之一在於黑父的情況比較常見,從而使紅黑樹需要旋轉的幾率相對AVL樹來說會少一些。

2.紅父

如果新點的父結點為紅色,這時就需要進行一系列操作以保證整棵樹紅黑性質。如圖3所示,由於父結點為紅色,此時可以判定,祖父結點必定為黑色。這時需要根據叔父結點的顏色來決定做什麼樣的操作。青色結點表示顏色未知。由於有可能需要根結點到新點的路徑上進行多次旋轉操作,而每次進行不平衡判斷的起始點(我們可將其視為新點)都不一樣。所以我們在此使用一個藍色箭頭指向這個起始點,並稱之為判定點。

2.1 紅叔

當叔父結點為紅色時,如圖4所示,無需進行旋轉操作,只要將父和叔結點變為黑色,將祖父結點變為紅色即可。但由於祖父結點的父結點有可能為紅色,從而違反紅黑樹性質。此時必須將祖父結點作為新的判定點繼續向上進行平衡操作。

需要注意,無論“父”在“叔”的左邊還是右邊,無論“新”是“父”的左孩子還是右孩子,它們的操作都完全一樣。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved