二叉树的遍历

二叉树的遍历模板
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
分析:
- 通过中序遍历和先序遍历建树
- 后续遍历输出
代码:
//二叉树
//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

浙公网安备 33010602011771号