【问题标题】:Finding PostOrder traversal from LevelOrder traversal without constructing the tree在不构造树的情况下从 Level Order 遍历中找到 PostOrder 遍历
【发布时间】:2023-11-17 18:07:02
【问题描述】:

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

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

【问题讨论】:

  • 我想你可能忘了问一个问题。
  • 我刚刚意识到,按顺序遍历这些树总是会产生01010...01010形式的序列。也许这个事实可以以某种方式使用。

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


【解决方案1】:

绝对有可能。

考虑到是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。关键是虽然你没有在程序中建立树,但是建立了它而是在你的脑海中,并将其转换为算法。

【讨论】:

    最近更新 更多