簡體   English   中英

從LevelOrder遍歷中查找PostOrder遍歷而無需構造樹

[英]Finding PostOrder traversal from LevelOrder traversal without constructing the tree

給定一個二叉樹,其中每個內部節點的值為1,葉節點為0。每個內部節點都有兩個孩子。 現在給定該樹的級別順序遍歷,返回同一棵樹的后順序遍歷。

如果構造一棵樹然后進行其后序遍歷,則可以輕松解決此問題。 雖然現在是O(n)時間。 但是可以在不構建樹的情況下打印postOrder遍歷。

絕對有可能。

考慮到它是完整的二叉樹 ,一旦確定了節點數,理論上樹的形狀就是唯一的。

將級別順序遍歷視為數組,例如1 2 3 4 5 6 7。

它代表這樣的樹:

      1
   2     3
 4  5   6  7

您想要獲得的是訂單遍歷:4 5 2 6 7 3 1。

第一步是計算樹的深度:

depth = ceil(log(2, LevelOrderArray.length))        // =3 for this example

之后,設置一個計數器= 0,並從原始數組的最底層逐個提取節點:

for(i=0, i<LevelOrderArray.length, i++){
    postOrderArray[i] = LevelOrderArray[ 2 ^ (depth-1) +i ]       //4,5,....
    counter++;                                                //1,2,.....
}

但是請注意,一旦計數器可以除以2,則意味着您需要從上一級檢索另一個節點:

if(counter mod 2^1 == 0)
    postOrderArray[i] = LevelOrderArray[ 2 ^ (depth -2) + (++i) ]        // =2 here, 
//which is the node you need after 4 and 5, and get 3 after 6 and 7 at the 2nd round

這里不要++計數器,因為計數器代表您從底層檢索到的節點數。

每次彈出2 ^ 2 = 4個節點,從第3層檢索另一個節點(從底部開始計數)

if(counter mod 2^2 == 0)
    postOrderArray[i] = LevelOrderArray[ 2 ^ (depth -3) + (++i) ]        // =1

每次彈出2 ^ 3 = 8個節點時,再次從第4層檢索另一個節點

....直到循環結束。

不是嚴格的C ++代碼,只是概念。 如果您完全理解該算法,那么即使有0和1,樹節點的值也沒有關系。關鍵是雖然您沒有在程序中構建樹,但是卻在腦海中構築了樹而是將其轉換為算法。

暫無
暫無

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

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