2-3樹 紅黑樹 簡介+實現


首先致敬一下 Robert Sedgewick!

學紅黑樹可以先從2-3樹開始, 因爲紅黑樹和2-3樹是等價的, 我們可以先理解簡單的2-3樹, 然後再把它轉爲紅黑樹

2-3樹

2-3樹也是滿足二分搜索樹的基本性質, 但是它的一個節點可以存放一個或兩個元素
可以存放兩個孩子的節點稱爲2節點, 存放三個的稱爲3節點
在這裏插入圖片描述
2-3樹的結構如下:
如果是2節點, 那麼左孩子都比自己小, 右孩子都比自己大
如果是3節點, 那麼左孩子都比自己大, 中間孩子都在自己的兩個值之間, 比如22在17和34之間, 右孩子都比自己大
在這裏插入圖片描述
2-3樹是一棵絕對平衡的樹: 從根節點到任意一個葉子節點經過的節點數量相同, 所以在添加的時候需要遵循一些規則

添加元素

新來元素, 不是新增葉子節點, 而是和最後找到的節點融合, 把兩個節點合併起來
if 融合之後是 3節點:
	end
else 融合之後是 4節點 (即有4個孩子, 存3個元素的節點):
	把 4節點 的拆成3個節點, 形成一棵二叉樹
	if 整棵樹就那3個節點
		end
	else
		向上找一個 2節點
		if 能找到
			拆出來的3個節點中的父親節點和找到的2節點融合成爲一個3節點
			end
		else 一直向上找到根節點, 只有一個 3節點
			融合形成一個 4節點
			拆成一棵二叉樹, 分成3個節點
			end

用文字很難描述清楚, 下面看一個例子吧, 比如依次添加 42, 37, 12, 18
在這裏插入圖片描述
再添加 6, 11, 5

紅黑樹

算法導論 中的紅黑樹:

紅黑樹是一棵具有下列特性的二分搜索樹:

1. 每個節點或者是紅色, 或者是黑色

2. 根節點是黑色的

3. 每一個葉子節點 (這裏的葉子節點指最後的空節點) 是黑色的

空樹也是紅黑樹

4. 如果一個節點是紅色的, 那麼他的孩子節點都是黑色的

5. 從任意一個節點到葉子節點, 經過的黑色節點是一樣的

實現

Map.java

public interface Map<K, V> {
    void add(K key, V value);
    V remove(K key);
    boolean contains(K key);
    V get(K key);
    void set(K key, V newValue);
    int getSize();
    boolean isEmpty();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章