動態平衡二叉搜尋樹的簡易實現,Treap 樹

2021-06-11 08:26:30 字數 1537 閱讀 4654

treap 樹是一種易於實現的近似平衡的二叉搜尋樹。treap 每個結點包括值和優先順序兩個屬性,值滿足二叉搜尋樹性質(左《中《右),優先順序滿足大頂堆的性質(左《中 && 右《中)。treap 樹的插入和刪除的實現比較簡單,插入結點時為待插結點隨機生產乙個優先順序值,按照bst的插入演算法並通過左旋或右旋調整保持優先順序大頂堆的性質;treap樹的查詢複雜度期望值為 o(logn) ;

public class treaptree 

}// treap樹的根結點

private node root = null;

// 檢查優先順序公共方法

public boolean check()

// 檢查是否滿足treap樹優先順序約束

private boolean check(node node) }

// 刪除公共方法

public void delete(int x)

// 刪除乙個結點並通過旋轉保持treap樹的性質

private node delete(node node) else if ( node.rc == null ) else else

return node;

} }

// 深度:公共方法

public int depth()

// 計算樹的深度

private int depth(node node) }

// 插入:公共方法

public void insert(int x)

// 插入:將新結點插入node為根的子樹,子樹的根可能發生變化

private node insert(node node, int x) else else if ( node.v < x )

return node;

} }

// 列印公共方法

public void print()

// 中序遍歷列印treap樹

private void print(node node) }

// 左旋:當前節點成為右孩子的左子樹,右孩子成為根

private node rotateleft(node node)

// 右旋:當前結點成為其左孩子的右子樹,左孩子成為根

private node rotateright(node node)

// 搜尋值等於v的結點並刪除它

private node searchanddelete(node node, int x) else if ( node.v < x ) else

return node;

} // 測試

public static void main(string args)

for ( int i=128; i<256; i++ )

system.out.printf("depth : %d, check : %b%n", tree.depth(), tree.check());

tree.print();

}}

平衡二叉搜尋樹

二叉搜尋樹的問題 平衡 banlance 平衡 當節點數量固定時,左右子樹的高度越接近,這棵二叉樹就越平衡 高度越低 最理想的狀態就是像完全二叉樹 滿二叉樹那樣,高度是最小的。前提 節點的新增 刪除順序是無法限制的,可以認為是隨機的。改進方案 在節點的新增 刪除操作之後,想辦法讓二叉搜尋樹恢復平衡 ...

將二叉搜尋樹變平衡

題目描述 給你一棵二叉搜尋樹,請你返回一棵 平衡後 的二叉搜尋樹,新生成的樹應該與原來的樹有著相同的節點值。如果一棵二叉搜尋樹中,每個節點的兩棵子樹高度差不超過 1 我們就稱這棵二叉搜尋樹是 平衡的 如果有多種構造方法,請你返回任意一種。思路分析 1.先將二叉搜尋樹進行中序遍歷儲存在list中,是有...

平衡二叉搜尋樹 左旋 右旋

上一節 紅黑樹前奏 對樹的基本理解 我們講到 二叉搜尋樹 單向鍊錶的問題,為了解決這個問題,我們引入了平衡二叉搜尋樹。所謂平衡二叉搜尋樹,必須滿足 bst 的特性。何為平衡,每個節點的平衡因子的絕對值 1.那麼平衡因子如何計算呢?大體思路 計算每個節點的高度高度 max 左子樹高度,右子樹高度 1每...