0
点赞
收藏
分享

微信扫一扫

7-10 树的遍历 (25 分)

九月的栩 2022-02-24 阅读 41
#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;
}




 

 
举报

相关推荐

0 条评论