题目描述:给出二叉树的中序和后序遍历序列,输出树的层次遍历结果
解题思路:根据中序和后序遍历,递归构建该二叉树。然后借助队列,对该二叉树进行层次遍历。
实验数据:
7
1 2 3 4 5 6 7(中序)
2 3 1 5 7 6 4(后序)
结果:
4 1 6 3 5 7 2
#include <queue>
#include <algorithm>
using namespace std;
const int maxn =101; int in[maxn],post[maxn]; int n;
struct node
{
int data;
node *left;
node *right;
};
node *create(int left1,int right1,int left2,int right2) //递归建二叉树
{
if(left1>right1)
return NULL;
else{
node *root=new node;
root->data = post[right2];
int i;
for( i=left1;i<=right1;i++) // 在中序中找到根节点的位置
if(in[i] == post[right2])
break;
int lr = i-left1; // 计算出左子树长度
root->left = create(left1,i-1,left2,left2+lr-1);
root->right = create(i+1,right1,left2+lr,right2-1);
return root;
}
}
void LevelOrder(node *root) // 借助栈进行层次遍历二叉树
{
queue <node*> q;
q.push(root);
node *temp = new node;
while(!q.empty())
{
temp= q.front();q.pop();
printf("%d ",temp->data);
if(temp->left) q.push(temp->left);
if(temp->right) q.push(temp->right);
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++) // 读入中序遍历
scanf("%d",&in[i]);
for(int i=0;i<n;i++) // 读入后续遍历
scanf("%d",&post[i]);
node *root = create(0,n-1,0,n-1); // 根据后序和中序建树
LevelOrder(root);
return 0;
}