1. 樹的分類
- 無序樹:樹中任意節點的子節點之間沒有順序關係,這種樹稱爲無序樹,也稱爲自由樹;
- 有序樹:樹中任意節點的子節點之間有順序關係,這種樹稱爲有序樹;
- 二叉樹:每一個節點最多含有兩個子樹的樹稱爲二叉樹;
- 徹底二叉樹:對於一顆二叉樹,假設其深度爲d(d>1)。除了第d層外,其它各層的節點數目均已達最大值,且第d層全部節點從左向右連續地緊密排列,這樣的二叉樹被稱爲徹底二叉樹;
- 平衡二叉樹(AVL樹):當且僅當任何節點的兩棵子樹的高度差不大於1的二叉樹;
- 排序二叉樹(二叉查找樹(英語:Binary Search Tree)):也稱二叉搜索樹、有序二叉樹;
- 霍夫曼樹:帶權路徑最短的二叉樹稱爲哈夫曼樹或最優二叉樹;
- B樹:一種對讀寫操做進行優化的自平衡的二叉查找樹,可以保持數據有序,擁有多於兩個子樹。
2.AVL樹
1. 參考連接
- 維基百科-AVL樹
2. 旋轉核心
- 在AVL樹中任何節點的兩個子樹的高度最大差異爲1
- 接受平衡因子-1,0,1,除此以外,均須要旋轉
3. 旋轉操做
假設平衡因子是左子樹的高度減去右子樹的高度所獲得的值,又假設因爲在二叉排序樹上插入節點而失去平衡的最小子樹根節點的指針爲a(即a是離插入點最近,且平衡因子絕對值超過1的祖先節點),則失去平衡後進行的規律可概括爲下列四種狀況:segmentfault
- 單向右旋平衡處理LL:
- 因爲在*a的左子樹根節點的左子樹上插入節點,*a的平衡因子由1增至2,導致以*a爲根的子樹失去平衡,則需進行一次右旋轉操做;
- 單向左旋平衡處理RR:
- 因爲在*a的右子樹根節點的右子樹上插入節點,*a的平衡因子由-1變爲-2,導致以*a爲根的子樹失去平衡,則需進行一次左旋轉操做;
- 雙向旋轉(先左後右)平衡處理LR:
- 因爲在*a的左子樹根節點的右子樹上插入節點,*a的平衡因子由1增至2,導致以*a爲根的子樹失去平衡,則需進行兩次旋轉(先左旋後右旋)操做。
- 雙向旋轉(先右後左)平衡處理RL:
- 因爲在*a的右子樹根節點的左子樹上插入節點,*a的平衡因子由-1變爲-2,導致以*a爲根的子樹失去平衡,則需進行兩次旋轉(先右旋後左旋)操做
- 小結:
- LR(2)->左旋->LL(2)->右旋->至平衡(0)
- RR(-2)->右旋->RL(-2)->左旋->至平衡(0)
3. 紅黑樹
3.1 定義
首先,知足一個二叉樹,其次知足5大性質,則可認爲是紅黑樹:優化
- 節點不是紅色就是黑色
- 根節點必須是黑顏色
- 全部葉子都是黑色(葉子是NIL節點)
- 每一個紅色節點必須有兩個黑色的子節點(也就是說任何路徑上不能有連續的紅色節點)
- 從任一節點到其每一個葉子的全部簡單路徑都包含相同數目的黑色節點
3.2 平衡核心
同AVL樹旋轉並保持其紅黑樹的特性。js動態演示-紅黑樹操做指針
3.3 操做核心
操做過程當中始終關注如下原則:code
- 始終保持着性質1和性質3
- 性質4只在增長紅色節點、重繪黑色節點爲紅色,或作旋轉時受到威脅。
- 性質5只在增長黑色節點、重繪紅色節點爲黑色,或作旋轉時受到威脅。
3.4 具體操做
3.4.1 符號解釋
- N:將要插入的節點(視爲紅色)
- P:N的父節點
- G:N的祖父節點
- U:N的叔父節點
- LR:父節點P是祖父節點G的左子節點且新節點N是其父節點P的右子節點
- LL:父節點P是祖父節點G的左子節點且新節點N是其父節點P的左子節點
- RL:父節點P是祖父節點G的右子節點且新節點N是其父節點P的左子節點
- RR:父節點P是祖父節點G的右子節點且新節點N是其父節點P的右子節點
3.4.2 插入時分狀況具體操做:
- 新節點N位於樹的根上,沒有父節點,則可直接將其重繪爲黑色;
- 新節點的父節點P是黑色,則直接插入,不做修改;(此處必然平衡,經過性質可證實,待寫)
- 若是父節點P和叔父節點U兩者都是紅色,則將父節點P和叔父節點U修改成黑,其祖父節點修改成紅,並將祖父節點視爲當前節點,依狀況再處理;
- 父節點P是紅色而叔父節點U是黑色或缺乏,此時,必然不平衡,須要旋轉,旋轉參照AVL樹規則,不一樣之處在於重繪顏色;
- LR:先左旋一次,轉換PN角色(即將旋轉下來的父節點p視爲當前節點N處理),此時爲LL狀況;
- LL:先重繪,將父節點P重繪爲黑色,祖父節點G爲紅色,再右旋一次,此時將祖父節點視爲當前節點處理;
- RL:與LR對稱,操做相似,只需把旋轉反向
- RR:與RR對稱,操做相似,只需把旋轉反向
3.4.3 刪除時分狀況具體操做:
3.4.3.1 刪除思想
樹的遞歸性產生了操做的遞歸性:若是須要刪除的節點有兩個兒子,那麼問題能夠被轉化成刪除另外一個只有一個兒子的節點的問題 緣由:在刪除帶有兩個非葉子兒子的節點的時候,咱們要麼找到它左子樹中的最大元素、要麼找到它右子樹中的最小元素,並把它的值轉移到要刪除的節點中。咱們接着刪除咱們從中複製出值的那個節點,它一定有少於兩個非葉子的兒子。由於只是複製了一個值,不違反任何性質,這就把問題簡化爲如何刪除最多有一個兒子的節點的問題。blog
3.4.3.2 刪除操做
首先字母解釋排序
X:最終被刪除的節點(至多一個孩子節點)
P:X的父親節點
N:X的孩子節點
S:X的兄弟節點
SL:S的左孩子
SR:S的右孩子
此時刪除操做的複雜度在於 刪除節點的顏色遞歸
- 當X爲紅色時,直接拿黑色節點N代替
- 當X爲黑色時,若N爲紅色時(黑+紅),拿黑色N節點代替
- 當X爲黑色時,若N爲黑色時(黑+黑),此時是最複雜的,共有6種狀況(如下狀況均已用N節點代替X節點):
- X爲根節點,此時,最爲簡單,直接用黑色N節點替換;
- S爲紅色,其餘節點均爲黑色(相似插入時LL操做後狀況),
- 均爲黑色,
- 操做:將S節點重繪爲紅色,將P節點按狀況1處理,繼續1-6排查
- P爲紅色,其餘節點均爲黑色,
- S爲黑色,S的左節點爲紅,右節點爲黑,P可紅可黑,但N爲P的左孩子
- S爲黑色,S的左節點可紅可黑,右節點爲紅,P可紅可黑,但N爲P的左孩子
- 操做:P,S左旋並互換顏色,並將SR重繪爲黑色,完結。
操做圖:
ip
1. 相關鏈接
- 維基-二叉搜索樹
- 維基-紅黑樹
- 思否-紅黑樹詳細分析
- 思否-紅黑樹1
- 思否-紅黑樹2