讀者盆友,晚上好。
本部落格**示例均來自:演算法 algorithmes forth edition前幾篇部落格順序的介紹了符號表的各種實現:[美] robert sedgewick kevin wayne 著 謝路雲譯
我們首先介紹了:無序鍊錶中順序查詢 -》 有序陣列中的二分查詢
二分查詢優缺點:
二分查詢
優點缺點
查詢非常快,已知的最快的方法,複雜度在log n
靜態的、有序的資料,無法應對動態插入的資料
接著:為了找到克服二分法缺點演算法,介紹了二叉查詢樹,這種數可以支援動態插入,同時它的key還能保持有序(可用二分法查),我們已經前進了一大步,然而二叉查詢樹也有缺點。
二叉查詢樹
優點缺點
支援動態插入資料,同時還能用二分法根據key快速查詢
最壞情況搜尋路徑上會出現n個節點
因此,我們繼續尋找看是否還有克服了二叉查詢樹最壞情況的演算法。
可喜的是,我們找到了:平衡查詢樹
平衡查詢樹能時刻保證「平衡」,所以會避免二叉查詢樹最壞的情況,同時又兼有之前優化後的各種優點,堪稱完美。
不過因為平衡二叉樹引入了4-節點等概念,為了簡化**,出現了紅黑二叉查詢樹,這種樹 簡單來說可以和 平衡查詢樹 「等價」,又可以避免4-節點的操作。所以,這是我們最終想要找到的。
平衡查詢樹
優點缺點
始終平衡,避免了二叉查詢樹最壞情況搜尋路徑上會出現n個節點的情況
**複雜,不好理解
好了,最終上今天的**:
package com.cmh.algorithm;
import
static edu.princeton.cs.algs4.stdin.isempty;
/** * author:起舞的日子
* ate: 2020/4/12 下午10:12
* 紅黑樹的插入演算法
*/public
class
redblackbst
comparable
, value>
return h.color;
}private node rotateleft
(node h)
private node rotateright
(node h)
private
void
flipcolors
(node h)
private
intsize()
private
intsize
(node x)
else
}private node put
(node h, key key, value val)
int cmp = key.
compareto
(h.key);if
(cmp <0)
else
if(cmp >0)
elseif(
isred
(h.right)&&!
isred
(h.left))if
(isred
(h.left)
&&isred
(h.left.left))if
(isred
(h.left)
&&isred
(h.right)
)return h;
}/**
* 刪除最小鍵
*/private node moveredleft
(node h)
return h;
}private node deletemin
(node h)if(
!isred
(h.left)&&!
isred
(h.left.left)
) h.left =
deletemin
(h.left)
;return
balance
(h);
}private node balance
(node h)if(
isred
(h.left)
&&isred
(h.left.left))if
(isred
(h.left)
&&isred
(h.right)
)return h;
}public
void
deletemin()
root =
deletemin
(root);if
(!isempty()
)}/** * 刪除最大鍵
*/private node moveredright
(node h)
return h;
}private node deletemax
(node h)
if(h.right == null)if(
!isred
(h.right)&&!
isred
(h.right.left)
) h.right =
deletemax
(h.right)
;return
balance
(h);
}public
void
deletemax()
root =
deletemax
(root);if
(!isempty()
)}/** * 紅黑樹最終的刪除操作
*/private node delete
(node h, key key)
h.left =
delete
(h.left, key);}
else
if(key.
compareto
(h.key)==0
&&(h.right == null))if
(!isred
(h.right)&&!
isred
(h.right.left))if
(key.
compareto
(h.key)==0
)else
}return
balance
(h);
}public value get
(key key)
private value get
(node x, key key)
int cmp = key.
compareto
(x.key);if
(cmp <0)
else
if(cmp >0)
else
}public key min()
private node min
(node x)
return
min(x.left);}
private
class
node
private
boolean
isred
(node x)
return x.color;}}
}
嗯,下次再會! 紅黑樹插入刪除演算法思想
一 紅黑樹介紹 紅黑樹是特殊的二叉查詢樹,具有以下五個特點 1 節點為黑色或紅色 2 根節點為黑色 3 紅色節點不能連續 4 根節點到nil節點的各個路徑上黑色節點數量相同 5 nil節點為黑色,nil節點為葉節點的空的孩子 根據性質 4 可知,紅色節點具有0或2個孩子。二 左旋和右旋 在紅黑樹刪除...
紅黑樹插入演算法
滿足下面幾個條件的二叉搜尋樹,稱為紅黑樹 1.任何乙個節點都被著色 紅色或是黑色。2.根節點是黑色的。3.所有的nil節點都看成黑色 nil節點是就是乙個假想的或是無實在意義的節點,所有應該指向null的指標,都看成指向了nil節點。包括葉節點的子節點指標或是根節點的父指標 4.如果乙個節點是紅色的...
紅黑樹的插入和刪除
上一章講述了紅黑樹得相關性質,我們了解到紅黑樹確實是平衡二叉樹,在時間複雜度為o lg n 比二叉搜尋樹效能更好,效能變好的前提是演算法更加複雜了,下面講述紅黑樹的插入和刪除操作,希望對大家有所幫助。紅黑樹的插入操作和二叉搜尋樹大致相同,不同點是在將節點x插入紅黑樹後,此時的紅黑樹可能會違反紅黑樹的...