簡體   English   中英

用二叉搜索樹構建AVL樹

[英]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)
  • 插入AVL將花費O(log n)
  • 2^(n + 1) - 1

所以總共要花費O(n*logn*2^n)並且這是非常昂貴的。

但是我為什么要從T1刪除? 我在那里支付了很多,沒有充分的理由。 所以我想到為什么不在T1使用樹遍歷,並且對於我正在訪問的每個節點,將其添加到AVL樹:

  • 2^(n + 1) - 1節點,因此遍歷將花費O(2^n) (訪問每個節點一次)
  • 每次將當前節點添加到AVL將花費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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM