题目描述
已知完全二叉树的先序/中序/后序序列,求层序序列
算法原理
没有什么好说的,因为是完全二叉树,所以可以由根节点直接找到孩子节点
如果根节点root是从0开始,那么左孩子就是root*2+1
右孩子就是root*2+2
如果根节点root是从1开始,那么左孩子就是root*2
右孩子就是root*2+1
因为是完全二叉树,也不是特别担心超限的问题
还有一种特殊情况就是给你一个CST(完全BST)树的每个节点的值,让你求层序遍历的结果,这种题就可以吧给出的节点从小到大排序,排序完成后的序列就是中序序列,然后按照上面的方法递归就可以了
核心代码实现
int t=0; //代表先序/中序/后序序列走到那个位置了
void inOrder(int root){
if(root>=n) return ; //超过范围
//level[root]=pre[t++]; 如果是先序序列在这个位置
inOrder(root*2+1); //递归左子树
//level[root]=in[t++]; 如果是中序序列在这个位置
inOrder(root*2+2); //递归右子树
//level[root]=post[t++]; 如果是后序序列在这个位置
}
例题