7-10 树的遍历 (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<bits/stdc++.h>
using namespace std;
const int N=1010; 
int k;
int per[N],in[N],post[N];
//定义二叉树 
struct node{
	int val;
	node *left;
	node *right;
	node(int x):val(x),left(NULL),right(NULL){}
	//node(int val=0,node *left=NULL,node*right=NULL):val(val),left(left),right(right){}
};
//建树
void build(int l,int r,int &t,node *&root){//t应该是后序的最后一位是根节点,然后从后向前遍历
	int flag=-1;//!!
	for(int i=l;i<=r;i++) //中序应该不需要管遍历顺序吧 
		if(in[i]==post[t]){
			flag=i;break; 
		}
	if(flag==-1) return ;
	//
	root=new node(in[flag]);
	//
	t--;
	/知道中序和后序,先递归右子树;;;知道先序和中序,先递归左子树 
	if(flag<r) build(flag+1,r,t,root->right);
	if(flag>l) build(l,flag-1,t,root->left);
	
} 
//层序遍历(暂时不会先空着)
//(层序遍历用队列)
void  level(node *T,int n){
	//node*
	queue<node*>queue;
	queue.push(T);//根节点放入队列
	while(!queue.empty()){//
		//1.
		T=queue.front();//对头元素出队,指针重新指向,front.()是将返回头元素但不删除 
		printf("%d",T->val);//父节点出队后,将左右孩子放入队列;
		if(n!=1) cout<<" ";
		n--;
		queue.pop();//删除队首元素 
		//2.
		if(T->left!=NULL)
			queue.push(T->left);//如果首元素的左子树不是空,将其左子树放入队列
			//入对的是一个地址元素
		//3.
		if(T->right!=NULL)
			queue.push(T->right); 
	} 
	
}
 


//清空 
 void re_free(node *root){
 	if(root==NULL) return ;
 	re_free(root->left);
 	re_free(root->right);
 	delete root;
 }

int main(){
	int n;
	while(~scanf("%d",&n)){
		for(int i=1;i<=n;i++) scanf("%d",&post[i]);
		for(int i=1;i<=n;i++) scanf("%d",&in[i]);
		node *root;
		int t=n;
		build(1,n,t,root);
		//缺一块层序遍历的代码及输出(先空着) 
		level(root,n);
		cout<<endl; 
		//
		re_free(root); 
	}
	
	return 0;
}




 

 

上一篇:[PAT乙] 1020 月饼 (25 分)


下一篇:libmodbus编译arm linux库方法