二叉树的遍历

忧愁散去!好运连连!

二叉树的遍历模板

hdu 1710 binary Traversals

题目链接

题意:

已知中序遍历和先序遍历,求后序遍历。

输入:

9
1 2 4 7 3 5 8 9 6
4 7 2 1 8 5 9 3 6

输出:

7 4 2 8 9 5 6 3 1

分析:

  1. 通过中序遍历和先序遍历建树
  2. 后续遍历输出

代码:

//二叉树
//hdu 1710
//已知中序遍历和先序遍历,求后序遍历。

#include<cstdio>

const int maxn= 1010;
int pre[maxn];//先序序列
int in[maxn];//中序序列
int post[maxn];//后序序列
int k; 

struct node{
	int data;
	node* l,* r;
	node(int data=0,node* l=NULL,node* r=NULL):data(data),l(l),r(r){}
};

void build_tree(int l,int r,int &t,node* &root){//[l,r]
	int flag=-1;
	for(int i=l;i<=r;i++){
		if(in[i]==pre[t]){
			flag=i;  //在中序序列中找到的根节点位置 
			break;
		}
	}
	
	if(flag==-1) return;  //结束
	root=new node(in[flag]); //新建结点
	
	t++;
	 
	if(flag>l) build_tree(l,flag-1,t,root->l); //if条件是为了防止越界 
	if(flag<r) build_tree(flag+1,r,t,root->r);
	 
} 

//输出先序序列 
void preorder(node *root){//注意:没有初始化k,要在main函数中初始化为1
	if(root!=NULL){
		pre[k++]=root->data;  //保存到pre数组 
		preorder(root->l);
		preorder(root->r); 
	}
} 

//输出中序序列
void inorder(node *root){
	if(root!=NULL){
		inorder(root->r);
		in[k++]=root->data;
		inorder(root->r);
	}
}


//输出后序序列
void postorder(node *root){
	if(root!=NULL){
		postorder(root->l);
		postorder(root->r);
		post[k++]=root->data;
	}
} 

void remove_tree(node * root){  //!!! 释放空间,不可少 
	if(root==NULL) return;
	remove_tree(root->l);
	remove_tree(root->r);
	delete root;
}

int main(){
	int n;
	while(~scanf("%d",&n)) {
		for(int i=1;i<=n;i++){//从1开始 
			scanf("%d",&pre[i]);
		}
		for(int i=1;i<=n;i++){
			scanf("%d",&in[i]);
		}
		
		node *root;
		int t=1;//指向pre数组的指针 
		build_tree(1,n,t,root); 
		k=1; //记录结点个数
		postorder(root);
		
		for(int i=1;i<k;i++){
			printf("%d%c",post[i],i==k-1?'\n':' '); 
		} 
		//别忘了摧毁树
		remove_tree(root);
	}
	return 0;
} 

参考:算法竞赛|入门到进阶 P69

posted @ 2021-04-20 11:30  辛勤的小码农^-^  阅读(39)  评论(0)    收藏  举报