繁体   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