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