[英]Building an AVL Tree out of Binary Search Tree
我需要建議一個采用BST(二進制搜索樹)的算法, T1
具有2^(n + 1) - 1
密鑰,並構建一個具有相同密鑰的AVL樹。 該算法應該在最差和平均時間復雜度方面有效(作為n
函數)。
我不知道該怎么辦呢。 很明顯,具有2^(n + 1) - 1
鍵的BST的最小尺寸是n
(如果它是完整/平衡的話就是這種情況),但它對我有什么幫助?
有一種直接的方法是迭代樹,每次將T1
的根添加到AVL樹然后從T1
刪除它:
T1
可能不平衡,因此在最壞的情況下刪除可能花費O(n) 2^(n + 1) - 1
所以總共要花費O(n*logn*2^n)
並且這是非常昂貴的。
但是我為什么要從T1
刪除? 我在那里支付了很多,沒有充分的理由。 所以我想到為什么不在T1
使用樹遍歷,並且對於我正在訪問的每個節點,將其添加到AVL樹:
2^(n + 1) - 1
節點,因此遍歷將花費O(2^n)
(訪問每個節點一次) O(logn)
所以總共要花費O(logn * 2^n)
。 這是我能想到的最好的時間復雜性,問題是,它能以更快的方式完成嗎? 喜歡在O(2^n)
? 將插入到AVL樹的某些方法僅花費O(1)?
我希望我很清楚,我的問題屬於這里。
非常感謝你,
諾姆
有一種平衡BST並在線性時間內運行的算法,稱為Day Stout Warren算法
基本上它所做的就是通過進行有序遍歷(O(n))將BST轉換為有序數組或鏈表。 然后,它遞歸地獲取數組的中間元素,使其成為根,並使其子元素分別成為左和右子數組的中間元素(O(n))。 這是一個例子,
UNBALANCED BST
5
/ \
3 8
/ \
7 9
/ \
6 10
SORTED ARRAY
|3|5|6|7|8|9|10|
現在這里是遞歸調用和結果樹,
DSW(initial array)
7
7.left = DSW(left array) //|3|5|6|
7.right = DSW(right array) //|8|9|10|
7
/ \
5 9
5.left = DSW(|3|)
5.right = DSW(|6|)
9.left = DSW(|8|)
9.right = DSW(|10|)
7
/ \
5 9
/ \ / \
3 6 8 10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.