JAVA拾遺 紅黑樹 Part I

2021-07-24 12:27:03 字數 1605 閱讀 8880

紅黑樹,應該說是我們著一些年輕程式設計師最害怕的玩意了,每當宿舍吹比演算法的時候,聊到樹,必然繞不開紅黑樹這個乖乖東西。

為了達到二分查詢的最佳效能,我們強調生成的二分查詢樹必須是最「平衡」的,即所有從root點開始往下探的路徑長度,總是相同的。可是總有的時候二分查詢樹是不會平衡的,多了乙個少了乙個都會影響其的平衡性。為了防止二分查詢樹出現最壞的情況,也為了提公升查詢的效率,這裡提出個概念,就是所謂的平衡查詢樹。

平衡查詢樹,即balance search tree,雖然和binary search tree縮寫相同,不過其卻可以完全保證自己是「平衡的」。

為什麼一定是平衡的呢?這要先從紅黑樹的理想模型,2-3樹開始講:

2-3樹就是一種由「2子節點的父節點」和「3子節點的父節點」組成的樹,描述上有些抽象,可以先給大家看一幅示意圖

如圖上所示,包含ej的節點就是所謂的3子節點,包含r的節點就是2子節點。

也可以輕易想到,對一棵完全被充滿,也就是從2-3樹變成3樹的樹進行搜尋操作時,每一次對比都會對資料進行三分,所以最後的複雜度是log3 n,在查詢操作上可以說是比二分查詢的最好情況(lgn)還要好一倍。同時,這種樹的最壞情況也就是一棵完整的二分查詢樹(所有的節點都是2子節點,也就是2樹),其最壞情況也和平衡二叉樹的二分查詢效率一樣。

聽上去很玄乎,但是這種樹是怎麼插入資料以保證這棵樹一定是完美的平衡二叉樹呢?

首先先說乙個理論:

如果一棵樹在經過操作前是完美平衡的、操作中也不會改變其平衡程度,那麼可以說這個樹在經歷操作後也會是完美平衡的。

可以細看一下對於這2-3樹的操作,一共有以下這幾種

1 節點分離 - 1

這個操作就是在某乙個點插入乙個根部的3節點後形成的4節點後發生的變化,中間的那個點變成這兩邊兩個點的root節點

2 節點分離 - 2

如果插入的位置不是根部節點,那麼中間這個節點就會被「頂」到上一層,如果上一層是2節點的話,就會發生上圖的行為,4節點會不斷轉化為兩個2節點並向上輸送乙個節點。

3 節點分離 - 3

如果插入的位置上面是乙個3節點,那麼就會發生上圖的情況,先把上層並成乙個4節點,在按照情況繼續向上輸送節點。

2-3樹實現了乙個簡單高效的二分查詢樹的優化模型,從定義也可以知道這棵樹總是一棵完美平衡二叉樹,因為在插入的過程中總是不會破壞他的平衡,但是在具體實現中會遇到很多問題。對這棵樹的效能分析如下

2-3樹很美麗,但是難以實現,由其的思想我們可以製作出一種新的樹狀結構,也就是「紅黑樹」。

未完待續

java 列舉型別拾遺

package com.zhi.learnj import com.zhi.learnj2.gender public class enumclass gender gender gender.m system.out.println gender system.out.println enum.v...

java拾遺之關鍵字while

好久沒有寫了,原因是最近在加班中,每天十二點睡六點起真是巨痛苦.本次的主題是while和do.while,因為是拾遺,所以關鍵字暫時就到這裡,像if判斷,switch多重判斷,finally final和finalize的區別,這些一些稍微基礎些,或synchronized public class...

java實現紅黑樹

package com.lsl public class redblacktree 節點左旋方法,將當前節點變為其右子樹的左子樹 private void leftrotate redblacknode x y.parent x.parent 將x的父親變為y的父親 if x.parent null...