[英]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.