簡體   English   中英

從inorder和preorder遍歷構造二叉樹的時間復雜度

[英]Time complexity of construction of a binary tree from inorder and preorder traversals

給定是從inorder和preorder遍歷構造樹的代碼。 我無法弄清楚他們是如何達到O(n ^ 2)時間復雜度的。 有任何想法嗎? 我看到在順序序列中搜索索引將是O(n),其余的如何計算?

O(N^2)復雜度是由於對於Preorder遍歷中的每個項目(其中有N ),您必須在Inorder遍歷中搜索其分區(同樣還有N個)。

粗略地說,您可以將此算法視為將節點放置在網格上,其中Inorder遍歷提供x坐標,Preorder遍歷提供y坐標:

以他們給出的示例為例,進行以下遍歷(Inorder then Preorder):

Inorder: DBEAFC
Preorder: ABDECF

現在這是他們正在使用的網格:

     D    B    E    A    F    C
A    +    +    +    A    |    |
     |    +--------------+    |
B|F  +    B    |         F    |
     +---------+         -----+
DE|C D         E              C

現在,算法需要知道網格中放置每個節點的位置,只需將節點放在網格中x和y坐標相同的位置即可。

在這種情況下,看起來網格的大小實際上是NlogN ,這將導致遍歷網格的NlogN復雜性(因此算法的NlogN時間復雜度), 但是這棵樹是平衡的 在最壞的情況下,您的樹實際上可能是一個鏈表。

例如,考慮這個樹,其中preorder和inorder遍歷是相同的:

Inorder: DBEAFC
Preorder: DBEAFC

     D    B    E    A    F    C
D    D    |    |    |    |    |
     -----+    |    |    |    |
B         B    |    |    |    |
          -----+    |    |    |
E              E    |    |    |
               -----+    |    |
A                   A    |    |
                    -----+    | 
F                        F    |
                         -----+
C                             C

這是最糟糕的情況,你看,網格中有N*N位置需要檢查。 因此在最壞的情況下,存在N*N時間復雜度。

你正在遍歷遞歸內的整個preorder數組,並在每個堆棧幀中搜索inorder遍歷數組中的數字。 所以O(N*N) = o(N^2)

你是絕對正確的,因為在inorder數組中搜索將花費O(n)時間

在最壞的情況下,T(n)= T(n-1)+ O(n)

解決這個問題我們得到T(n)= O(n²)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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