给定一个二叉树,其中每个内部节点的值为1,叶节点为0.每个内部节点 节点只有两个孩子。现在给出这个树的级别顺序遍历返回后序 遍历同一棵树。
如果我构造一个树然后进行后序遍历,这个问题就可以很容易地解决了。虽然是O(n)时间。但是可以在不构建树的情况下打印postOrder遍历。
答案 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都是如此。虽然你没有在程序中构建树,但是在你的脑海里建立它,并将其转换为算法。