2-3-4樹是一種階為4的b樹。它是一種自平衡的資料結構,可以在o(lgn)的時間內查詢、插入和刪除,這裡的n是樹中元素的數目。2-3-4樹和紅黑樹是等價的,也就是每個紅黑樹都可以轉化為一顆2-3-4樹,每個選擇操作也和2-3-4樹中的**操作對應。
2-3-4樹是這樣一種資料結構,滿足如下性質:
1) 每個節點每個節點有1、2或3個key,分別稱為2-node,3-node,4-node。
2) 每個節點的keys把區間進行了劃分,以4-nde為例,key1、key2、key3分別夾在subtree1, subtree2和subtree2, subtree3和subtree3, subtree4之間。
3) 4-node的子節點不能是4-node。
如下圖所示:
搜尋:
1. 從root開始
2. 比較當前節點的值
2.1 如果找到,就返回當前節點
2.2 如果沒有找到,就找出要搜尋的值屬於哪乙個子樹
3. 遞迴的搜尋子樹
在插入和刪除的關鍵是維持性質3),即4-node的節點不能是4-node
插入key
1.遞迴搜尋key
1.1 如果root是4-node(abc),則建乙個新的root(b),a,c成為它的兩個子樹
1.2 向下搜尋, 對於中途經過的每乙個node, 如果它是4-node則使用如下圖的變換分拆(注意到根據假設演算法不會產生4-node的子節點是4-node, 所以這個操作總是能進行的)
1.3 如果相應的key已存在, 則演算法結束, 不需要插入
2. 注意到如果key不存在, 則1的遞迴搜尋一定停在葉節點
3. 在當前的葉節點插入
3.1 如果是2-node或3-node, 則插入當前節點把它變成3-node或4-node, 演算法結束
3.2 如果是4-node, 則根據假設, 它的父節點一定不是4-node(即是2-node或者3-node)
3.2.1 使用與1.2相同的變換分拆4-node
3.2.2 插入相應節點(如圖所示, 一定是2-node)
要證明2-3-4上面的出入演算法一定形成乙個平衡樹,即從root開始往下到任乙個葉子的長度都是相等。
用數學歸納法:
1. 只有乙個節點的樹當然是平衡的
2. 假設插入了n個元素,樹還是平衡的,現在插入乙個新元素,要證明不會破壞平衡性:
演算法會改變tree的是1.1, 1.2, 3.1, 3.2。顯然1.2, 3.1, 3.2都不會改變樹的深度,考慮1.1,它令樹的路徑深度增加1,原來的樹是平衡的,深度增加後當然還是平衡的。
有n個元素的2-3-4樹的深度的粗略估計;最壞情況全是2-node,則深度是logn,最好情況全是4-node,深度為logn/2,故:
logn/2 < depth ≤ logn(左邊括號是不可能的,因為不存在4-node的子節點是4-node)。
想詳細了解**實現,請移步我這裡只提一些概念性的東西
Java資料結構之234樹
n叉樹簡介 每個節點只有乙個資料項,並且每個節點最多只有兩個子節點的樹稱為二叉樹。如果每個節點可以存多個 大於等於3 資料項,並且每個節點可以擁有多個 大於等於3 子節點的樹稱為n 大於等於3 叉樹。n叉樹相對於二叉樹而言,儲存相等數量的資料,n叉樹因為同一層存放的資料變多,相應樹的高度就變小,查詢...
資料結構與演算法之2 3 4樹
外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img y3sprlm2 1615947159678 不太平衡的二叉樹 對於乙個普通的二叉查詢樹,我們可以發現乙個問題,存在一定的可能性,一般的二叉查詢樹會退化成一般的鍊錶.上圖還沒有完全退化,但是如果查詢6這個結點,會比其他的葉子結點走更...
資料結構 2 3 4樹與紅黑樹
前面講到了2 3樹,2 3樹是允許節點最多有三個子節點的樹,2 3樹中有2節點和3節點,2節點跟普通的二叉樹節點一樣,3節點ab就是的左子樹上的所有節點的值小於a,中子樹上所有節點的值大於a而小於b,右子樹上節點的值大於b。2 3樹是一種平衡樹。2 3 4樹跟2 3樹差不多,只不過是把節點的最大子節...