紅黑二叉樹
紅黑二叉樹的基本思想是想用標準的二叉查詢樹(完全由2-結點構成)和一些額外的資訊(替換3-結點)來表述2-3樹。
或者說,我們將3-結點表示為由一條左斜的紅色鏈結相(兩個2-結點其中之一是另乙個的左子節點)連的兩個2-結點。
這種表示的優點:我們無需修改就可以直接使用標準二叉查詢樹的get()方法。對於任意的2-3樹,只要對結點進行轉換,我們都可以立即派生出一顆對應的二叉查詢樹。我們用這種方式表示2-3樹的二叉查詢樹稱為紅黑二叉樹。
一種等價的定義
滿足這樣定義的紅黑樹和相應的2-3樹是一一對應的。
一一對應
我們將一顆紅黑樹中的紅鏈結畫平,那麼所有的空鏈結到根結點的距離都將是相同的。如果我們將由紅鏈結相連的結點合併,得到的就是一顆2-3樹。
如果將一顆2-3樹中的3-結點畫作由紅色左鏈結相連的兩個2-結點,那麼不會存在能夠和兩條紅鏈結相連的結點,且樹必然是完美黑色平衡的。
紅黑樹即是二叉樹,又是2-3樹。
顏色表示
每個結點都有乙個指向自己的鏈結,我們將鏈結的顏色儲存在表示結點的node資料型別的布林變數color中。如果指向它的鏈結為紅色,則color為true,反之為false。我們約定空鏈結為黑色。
packagecn.chen.tree;
public classrbt ,value>
privatenode put(node h,key key, value value){
if(h ==null)return newnode(key, value,1,red);
intcmp = key.compareto(h.key);
if(cmp > 0) h.left= put(h.left, key, value);
else if(cmp < 0) h.right= put(h.right, key, value);
elseh.value= value;
if(isred(h.right) && !isred(h.left)) h = rotateleft(h);
if(isred(h.left) && isred(h.left.left)) h = rotateright(h);
if(isred(h.left) && isred(h.right)) flipcolors(h);
h.n= size(h.left) + size(h.right) + 1;
returnh;
二叉樹 紅黑樹
也就是說,二叉排序樹中,左子樹都比節點小,右子樹都比節點大,遞迴定義。根據二叉排序樹這個特點我們可以知道,二叉排序樹的中序遍歷一定是從小到大的,比如上圖,中序遍歷結果是 1 3 4 6 7 8 10 13 14 效能取決於 public class demo public static void m...
二叉樹(三) 紅黑樹
紅黑樹是一種自平衡的二叉查詢樹,可解決二叉查詢樹因為多次插入新節點導致的不平衡問題。除了二叉查詢樹的基本特性外,還具有下列的特性 1 節點是紅色或者黑色 2 根節點是黑色 3 每個葉子節點都是黑色的空節點 nil節點 4 每個紅色節點的兩個子節點都是黑色。從每個葉子到根的所有路徑上不能有兩個連續的紅...
二叉樹與紅黑樹
應用場景 1.伺服器io口,心跳包 2.多執行緒就緒,延時,等待,睡眠集合 二叉樹的遍歷分為 前序,中序,後序,按層次 如何檢測二叉樹資料對不對?可以使用中序遍歷,因為中序遍歷可以通過對映的方法來判斷二叉樹的資料對不對。如何解決最壞情況下的二叉樹?使用平衡二叉樹的話,在插入資料的時候,效能會非常差,...