L2-006 树的遍历 (25 分)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
解题思路:
本题的解题思路主要运用树的创建和树的层次遍历。
#include<iostream>
using namespace std;
#include<queue>
typedef struct tree
{
int data;
tree* lchild;
tree* rchild;
}Tree,*BitTree;
queue<BitTree>q;
int result[30];
BitTree createTree(int*a,int*b,int ba, int bi,int mi,int ma)
{
BitTree T;
T = new tree();
T->data = a[bi];
int i;
for (i = mi; i <= ma; i++)
if (a[bi] == b[i])
break;
int lb = i - mi;
int rb = ma - i;
if (lb > 0)
{
T->lchild = createTree(a, b, ba, ba + lb - 1, mi, mi + lb - 1);
}
else
T->lchild = NULL;
if (rb == 0)
{
T->rchild = NULL;
}
else
{
T->rchild = createTree(a, b, ba + lb, ba + lb + rb - 1, mi + lb + 1, mi + lb + rb);
}
return T;
}
void levelTree(BitTree t)
{
BitTree p;
q.push(t);
int i = 0;
while(!q.empty())
{
p = q.front();
if (p->lchild)
q.push(p->lchild);
if (p->rchild)
q.push(p->rchild);
result[i] = q.front()->data;
q.pop();
i++;
}
}
int main()
{
int n;
int a[30],b[30];
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
cin >> b[i];
BitTree t=createTree(a,b,0,n-1,0,n-1);
levelTree(t);
for (int i = 0; i < n-1; i++)
cout << result[i]<<" ";
cout << result[n - 1];
return 0;
}