在不构建树的情况下从Level Order遍历中查找PostOrder遍历

时间:2014-11-04 09:28:41

标签: c++ algorithm binary-tree tree-traversal

给定一个二叉树,其中每个内部节点的值为1,叶节点为0.每个内部节点 节点只有两个孩子。现在给出这个树的级别顺序遍历返回后序 遍历同一棵树。

如果我构造一个树然后进行后序遍历,这个问题就可以很容易地解决了。虽然是O(n)时间。但是可以在不构建树的情况下打印postOrder遍历。

1 个答案:

答案 0 :(得分:0)

这绝对是可能的。

考虑到它是Full Binary Tree,一旦确定了节点数,理论上,树的形状是唯一的。

将级别顺序遍历作为数组进行处理,例如,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

之后,设置一个counter = 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都是如此。虽然你没有在程序中构建树,但是在你的脑海里建立它,并将其转换为算法。