红黑树的删除_红黑树
紅黑樹是許多“平衡的”查找樹中的一種,它能保證在最壞的情況下,基本的動態集合操作(插入和刪除)的時間為O(lgh)。我們先簡單敘述二叉查找樹的性質。
1.1 二叉查找樹
二叉查找樹性質:設x為二叉樹中的任一結點,那么對于x左子樹中的任一結點y都有key[y]≤key[x],x右子樹中的任一結點y都有key[x]≤key[y]。
設二叉樹高度為h,下面是各個操作的算法時間復雜度:
靜態操作:查找結點、找前驅、后繼等時間為O(h)
動態操作:插入和刪除結點等時間為O(h)
對于插入操作,新結點總是插入在某個葉結點位置;對于刪除操作需依被刪結點z的情況而定:
①z無左右孩子
②z只有一個孩子
③z的左右孩子均存在
1.2 紅黑樹
1.2.1紅黑樹的特性
紅黑樹首先是一棵二叉查找樹,所以二叉查找樹的所有性質紅黑樹都具有,此外還有自身五個性質:
①每個結點要么是黑色要么是紅色
②樹根結點的顏色為黑色
③葉結點(nil)為黑色
④如果某個結點為紅色,則它的左、右孩子結點均為黑色
⑤對樹中任一結點,所有從該結點出發到其葉結點的路徑中均包含相同數目的黑色結點
外部結點(external node,葉節點):不包含實際關鍵字
內部結點(internal node):包含實際關鍵字
分別代表:雙親,保存的值,左孩子,右孩子,顏色。
黑高度(Black height):黑高度bh(x)表示從x結點出發(不包含x結點)到其葉結點路徑上的黑色結點個數。
Thearem1:具有n個內部結點的紅黑樹高度最多為2lg(n+1)。
proof:設紅黑樹的高度為h,即要證明h≤2lg(n+1)。
一個簡單的數學歸納法,直接把老師的屁屁踢圖片放上了。
由該定理大致猜到,動態集合操作的插入和刪除都可以在O(lgn)時間內完成。
1.2.2 紅黑樹的調整操作
旋轉(rotate)分為兩種:左旋和右旋操作。
左旋的偽碼。
一個實際操作:
1.2.3 紅黑樹的插入操作
插入一個新結點分為二步完成:
1. 按照二叉查找樹的方式插入新結點z
2. 恢復紅黑樹的特性
首先檢查紅黑樹5個特性可能遭受破壞的情況,然后針對遭受破壞的特性制定具體恢復的策略。(這里是將插入點置為紅色會產生下列情況,若置插入點為黑色,則性質⑤容易被破壞,所以我們置插入點為紅色,這樣就避免破壞性質⑤)
①每個結點要么是黑色要么是紅色(未被破壞)
②樹根結點的顏色為黑色(有可能被破壞,但修復很簡單)
③葉結點(nil)為黑色(未被破壞)
④如果某個結點為紅色,則它的左、右孩子結點均為黑色(有可能被破壞)
⑤對樹中任一結點,所有從該結點出發到其葉結點的路徑中均包含相同數目的黑色結點(未被破壞)
因此我們需要修復的只可能是第②和④條性質。偽碼如下。
else same as那里是指鏡像的情況,所有的left和right都鏡像變成right和left。
該算法在每次迭代的開頭保持下列三個部分的不變式:
①節點z是紅色的
②如果z.p是根節點,則z.p是黑節點
③若有任何紅黑樹的性質被破壞,則至多只有一條性質被破壞,或者是性質2,或者是性質4。(事實上,性質2被破壞,是由于z是根節點且是紅節點。如果性質4被破壞,其原因是z和z.p都是紅節點。)
下面用一個例子實際操作一下這段代碼,簡單順一下這個過程。
以一個實際例子來說明如何從頭開始生成一棵紅黑樹。首先是一份小總結。
1.2.4 紅黑樹的刪除
這東西是真的繁瑣,不寫了,有需要再看。還有紅黑樹的應用什么的,假期再補上吧。
下面是一篇寫的很好的文章。
程序員吳師兄:我畫了 20 張圖,給女朋友講清楚紅黑樹?zhuanlan.zhihu.com忘掉了,還有個需要注意的地方,寫在最后。
這個圖b)里注意看根節點,它有一個父節點,是個空的黑節點。
——————————————————————————————————————
下午寫流,然后晚做周一要講的數據挖掘競賽的PPT。期末復習真的好煩啊,沒時間做自己想學的東西。
總結
以上是生活随笔為你收集整理的红黑树的删除_红黑树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测试框架
- 下一篇: CommunityServer读取Blo