问题 D: 树的遍历 由后序和中序遍历结果和结点数求解层次遍历

题目描述

给出一颗二叉树的后序和中序遍历结果,输出这颗二叉树的层次遍历结果。

输入

第一行一个整数n(<= 30),表示二叉树上结点的个数。

第二行n个整数表示后序遍历结果。

第三行n个整数表示中序遍历结果。


输出

输出层次遍历结果。

样例输入

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

样例输出

4 1 6 3 5 7 2

算法实现:

#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
const int maxn=50;
struct node                     //节点 
{
	int date;
	node* ld;
	node* rd;
} ;
int pre[maxn],in[maxn],post[maxn]; 
int n;         //节点个数 
node* create(int postFirst,int postEnd,int inFirst,int inEnd)    //由后序和中序构建一颗树 形参分别为后序和中序排列的首元素尾元素 
{
	if(postFirst>postEnd)      //如果遍历到后序的首元素大于后序的尾元素下标(结点全部遍历完) 结束 
	return NULL;
	node* root=new node;              //建立一个新的节点,存放当前二叉树的根节点         
	root->date =post[postEnd];          //新节点的数据域为当前根节点的值 
	int k;
	for(k=inFirst;k<=inEnd;k++)    //找到 中序数组中与后序尾元素大小相等的元素 记录下标 k 
	{
		if(in[k]==post[postEnd])
		break;
	}
	int numleft=k-inFirst;              //该下标即为左子树的节点个数 
	root->ld =create(postFirst,postFirst+numleft-1,inFirst,k-1);//递归找子序列的左子树和右子树 
	root->rd =create(postFirst+numleft,postEnd-1,k+1,inEnd);
	return root;
}
int num=0;                          //已经输出的节点个数,便于空格输出
void bfs(node* root)  
{  
    queue<node*> q;  
    q.push(root);  
    while(!q.empty()  )  
    {  
        node* now=q.front() ;  
        q.pop() ;  
        cout<<now->date;  
        num++;  
        if(num<n) cout<<' ';     
        if(now->ld !=NULL) q.push(now->ld );  
        if(now->rd !=NULL) q.push(now->rd );  
            
     }   
}
int main()  
{  
    cin>>n;  
    for(int i=0;i<n;i++)   //后序输入   
    cin>>post[i];  
    for(int i=0;i<n;i++)  //中序输入   
    cin>>in[i]; 
    node* root=create(0,n-1,0,n-1);     
    bfs(root);           //层序输出   
    return 0;  
}  
  

猜你喜欢

转载自blog.csdn.net/qq_41486817/article/details/80617294