数据结构中的树 --- 红黑树
紅黑樹是一種幾近平衡的二叉搜索樹, 但不是AVL樹.
1 紅黑樹的一些特殊性質(zhì)
1.?每個節(jié)點皆為紅色或者黑色。
2.?根節(jié)點是黑色。
3.?每個葉子節(jié)點(NIL)是黑色(注意, 每個葉子節(jié)點必須都為空節(jié)點, 也就是指針為nullptr, 無key值)。
4.?每個紅色結(jié)點的兩個子結(jié)點一定都是黑色。
5.?任意一結(jié)點到以其為根節(jié)點的樹的每個葉子結(jié)點的路徑都包含數(shù)量相同的黑結(jié)點。
2 紅黑樹的插入和刪除操作
2.1 插入操作
當我們要插入一個key值的節(jié)點時, 需要走以下步驟
1. 按照二叉搜索樹的插入操作規(guī)則插入節(jié)點(此時節(jié)點并無顏色, 但是我們要通過后續(xù)操作讓此時的樹變?yōu)榧t黑樹).
2. 把新插入的節(jié)點(如果不是根節(jié)點的話)置為紅色
原因如下:
根據(jù)性質(zhì)5, 如果將新插入的節(jié)點A置為黑色, 那么A需要有兩個黑色的子節(jié)點(空的), 那么其父節(jié)點到A的兩個葉子節(jié)點的路徑上就會有兩個黑色節(jié)點(包括A和A的子節(jié)點), 多出A到其他葉節(jié)點的1個.
3. 如果當前節(jié)點的父節(jié)點是紅色, 進行"調(diào)整"(具體調(diào)整方法如下).
調(diào)整:
由于此時插入節(jié)點為紅色且其父節(jié)點也為紅色, 那么此時樹不滿足紅黑樹的性質(zhì)4, 那么就不是一棵紅黑樹, 那么需要讓其滿足性質(zhì)4. 如圖:
3.1 叔叔節(jié)點也是紅色
將父節(jié)點和叔叔節(jié)點均置為黑色, 若祖父節(jié)點不是根節(jié)點, 將祖父節(jié)點置為紅色, 將當前節(jié)點置為祖父節(jié)點, 對當前節(jié)點繼續(xù)進行"調(diào)整"
如例題所示, 當我們要插入key值為35的節(jié)點:
- 發(fā)現(xiàn)需要插在50的左子節(jié)點, 然后置為紅色:
- 發(fā)現(xiàn)35的父親50和叔叔節(jié)點75都為紅色, 那么把二者都置為黑色, 并把祖父節(jié)點60置為紅色:
- 當前節(jié)點為60, 紅色, 其父節(jié)點40和叔叔節(jié)點120皆為紅色, 那么將二者置為黑色, 祖父節(jié)點為根節(jié)點, 不變色:
3.2 叔叔節(jié)點為黑色, 且當前節(jié)點是右孩子
當前節(jié)點是紅色, 父節(jié)點也是紅色, 但是其叔叔節(jié)點是黑色, 且當前節(jié)點是父節(jié)點的右孩子, 那么就將父節(jié)點左旋.
3.3 叔叔節(jié)點為黑色, 且當前節(jié)點是左孩子
當前節(jié)點是紅色, 父節(jié)點也是紅色, 但是其叔叔節(jié)點是黑色, 且當前節(jié)點是父節(jié)點的左孩子, 那么就將父節(jié)點置為黑色, 將祖父節(jié)點置為紅色, 并將祖父節(jié)點右旋.
2.2 刪除操作
刪除操作, 跟二叉搜索樹的操作一樣, 先把節(jié)點刪除, 然后:
1. 如果節(jié)點是葉節(jié)點, 那么直接刪除
2. 如果被刪除的節(jié)點只有一個子節(jié)點, 那么子節(jié)點直接代替刪除節(jié)點位置
3. 如果被刪除節(jié)點有左右子節(jié)點, 那么找出中序遍歷的后繼節(jié)點, 把要刪除的節(jié)點的值更新為其后繼節(jié)點的值, 然后刪除后繼節(jié)點(注意, 其后繼節(jié)點必然是其右子樹的中序遍歷的第一個節(jié)點, 也就是肯定不會有左子節(jié)點, 但凡有左子節(jié)點, 左子節(jié)點一定排在它本身前面, 所以被刪除的節(jié)點最多有一個子節(jié)點, 可以按照1, 2情況對其進行分析).
4. 如果刪除的節(jié)點位置是黑色節(jié)點, 那么就需要進行"調(diào)整"
調(diào)整:
調(diào)整還是根據(jù)刪除后的當前情況進行.
刪除節(jié)點后, 當前樹可能會不符合紅黑樹的2,4,5性質(zhì), 也就是根節(jié)點為黑色, 紅色節(jié)點的子節(jié)點為黑色,?節(jié)點到該節(jié)點的子孫節(jié)點的所有路徑上包含相同數(shù)目的黑節(jié)點. 此時我們需要觀察刪除的那個節(jié)點位置代替者的情況, 如果其原本為紅色, 直接將該位置置為黑色, 結(jié)束調(diào)整. 如果其原本為黑色且是該位置為根節(jié)點, 也是不需要做什么, 結(jié)束掉.?
那么剩下的情況就是, 被刪除的節(jié)點為黑色, 且代替他位置的節(jié)點也為黑色, 且該位置不是根節(jié)點, 那么有以下四種情況(假設當前節(jié)點為刪除位置的節(jié)點):
https://www.jianshu.com/p/e136ec79235c
1. 兄弟節(jié)點為紅色
2. 兄弟節(jié)點為黑色, 且兄弟節(jié)點的子節(jié)點也都為黑色
3. 兄弟節(jié)點為黑色, 且兄弟節(jié)點左子為紅色, 右子為黑色
4. 兄弟節(jié)點為黑色, 且兄弟節(jié)點右子為紅色.
總結(jié)
以上是生活随笔為你收集整理的数据结构中的树 --- 红黑树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu 改linux密码忘了怎么办
- 下一篇: 自学java编译老是出错_为什么按照书上