这道题主要考察了树的遍历,如何从后序遍历与中序遍历的序列中重新建立一颗树,并且进行层序遍历。
重点在于如何建立这棵树,树是递归定义的,那么我们就递归建立树。
后序遍历的最后一个点即是当前树的根,再根据中序遍历序列,我们可以将树分成左右子树,递归重新得到树。
层序遍历则利用队列简单解决。
#include<iostream>
#include<queue>
using namespace std;
int inorder[40] = { 0 };
int postorder[40] = { 0 };
int ltree[40] = { 0 };
int rtree[40] = { 0 };
int n;
//树的结构是递归定义的,递归分别建立左子树和右子树,返回根
//r1为当前树根(即后序遍历的最后一个结点)
int rebuild(int l1, int r1,int l2,int r2)
{
if (l1 > r1)
return 0;
int root = postorder[r1]; //后序遍历最后一个结点是根
int i = l2;
while (inorder[i] != root) i++;
ltree[root] = rebuild(l1, r1 - r2 + i - 1, l2, i - 1);
rtree[root] = rebuild(r1 - r2 + i , r1 - 1, i + 1, r2);
return root;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++) cin >> postorder[i];
for (int i = 0; i < n; i++) cin >> inorder[i];
queue<int> q;
int root = rebuild(0, n - 1, 0, n - 1);
q.push(root);
while (!q.empty())
{
int tmp = q.front();
q.pop();
if (ltree[tmp])q.push(ltree[tmp]);
if (rtree[tmp])q.push(rtree[tmp]);
if (tmp == root)
cout << tmp;
else
cout << " " << tmp;
}
cout << endl;
system("pause");
return 0;
}