演算法7 紅黑樹的插入與刪除

2021-10-04 22:47:16 字數 3669 閱讀 7913

讀者盆友,晚上好。

本部落格**示例均來自:演算法 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插入紅黑樹後,此時的紅黑樹可能會違反紅黑樹的...