二叉树遍历

来源:互联网 发布:威科姆网络机顶盒 编辑:程序博客网 时间:2024/05/29 16:08

由二叉树的后序遍历和中序遍历,求前序遍历
方法1:不用构造二叉树,在遍历过程中就可求得前序遍历

#include<stdio.h>#include<stdlib.h>typedef struct TNode* BinTree;struct TNode{    int data;    BinTree left,right;};void build(int* post,int* in,int n,int* ans){//有后序遍历post和中序遍历in,求前序遍历ans     if(!n) return;    int i;    for(i=0;i<n;i++){        if(post[n-1]==in[i]) break;    }    build(post,in,i,ans+1);    build(post+i,in+i+1,n-1-i,ans+i+1);    ans[0]=post[n-1];}int main(){    int N;    scanf("%d",&N);    int post[N],in[N],ans[N];    int i;    for(i=0;i<N;i++){        scanf("%d",&post[i]);    }    for(i=0;i<N;i++){        scanf("%d",&in[i]);    }    build(post,in,N,ans);    for(i=0;i<N;i++){        printf("%d ",ans[i]);    }    return 0;}

法2:先构造二叉树,在前序遍历

#include<stdio.h>#include<stdlib.h>typedef struct TNode* BinTree;struct TNode{    int data;    BinTree left,right;};BinTree build(int* post,int* in,int n){//有后续便利和中序遍历构造二叉树     if(!n) return NULL;    BinTree root=malloc(sizeof(struct TNode));    int i;    for(i=0;i<n;i++){        if(post[n-1]==in[i]) break;    }    root->data=post[n-1];    root->left=build(post,in,i);    root->right=build(post+i,in+i+1,n-1-i);    return root;}void pre_travel(BinTree root){//前序遍历二叉树     if(!root) return;    printf("%d ",root->data);    pre_travel(root->left);    pre_travel(root->right);}//void in_travel(BinTree root){//中序遍历二叉树 //  if(!root) return;//  in_travel(root->left);//  printf("%d ",root->data);//  in_travel(root->right);//} //void post_travel(BinTree root){//后序 //  if(!root) return;//  post_travel(root->left);//  post_travel(root->right);//  printf("%d ",root->data);//}int main(){    int N;    scanf("%d",&N);    int post[N],in[N],ans[N];    int i;    for(i=0;i<N;i++){        scanf("%d",&post[i]);    }    for(i=0;i<N;i++){        scanf("%d",&in[i]);    }    BinTree root=build(post,in,N);    pre_travel(root);printf("\n");    in_travel(root);printf("\n");    post_travel(root);printf("\n");    return 0;}
0 0