Description
给定一个二叉树的中序序列和后序序列输出层序序列。
Sample Input:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2
Solution
如图所示确定中序和后序的边界。层次遍历采用广度优先搜索即可。
#include <queue>
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 50;
struct node
{
int data;
node *lchild;
node *rchild;
};
int pre[maxn], in[maxn], post[maxn];
int n; //节点个数
//当前二叉树后序区间为[postsL, postR],中序区间为[inL, inR]
//返回构建的二叉树根节点
node *create(int postL, int postR, int inL, int inR)
{
if (postL > postR) // 递归退出
return NULL;
node *root = new node;
root->data = post[postR];
int k;
for (k = inL; k <= inR; k++)
{
if (in[k] == post[postR]) //查找in序列中根节点位置记录为k
break;
}
int numLeft = k - inL; //通过中序序列计算左子树节点数
//返回左子树和右子树节点地址
root->lchild = create(postL, postL + numLeft - 1, inL, k - 1);
root->rchild = create(postL + numLeft, postR - 1, k + 1, inR);
return root;
}
void BFS(node *root)
{
queue<node *> q; //保存地址
q.push(root);
int numNode = 0;
while (!q.empty())
{
node *now = q.front(); //取出队首元素
q.pop();
printf("%d", now->data); //访问数据
numNode++; //控制输出空格最后一次不输出空格
if (numNode < n)
printf(" ");
if (now->lchild != NULL)
q.push(now->lchild);
if (now->rchild != NULL)
q.push(now->rchild);
}
}
int main()
{
// freopen("in.txt", "r", stdin);
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &post[i]);
for (int i = 0; i < n; i++)
scanf("%d", &in[i]);
node *root = create(0, n - 1, 0, n - 1);
BFS(root);
return 0;
}