二叉树求序

来源:互联网 发布:万得数据 编辑:程序博客网 时间:2024/06/05 05:57

数组实现已知(中序+一序)求另一序。

  • 中序先序求后序
    算法的核心在于,每次先将结点存放在当前树的最后一个位置,再递归结点的子树,不断递归。

    #include "stdio.h"int pre[6],in[6],post[6];void solve(int preL,int inL,int postL,int n){    if(n==0) return;    if(n==1){        post[postL] = pre[preL];        return;    }    int root = pre[preL];    int i;    post[postL+n-1] = root;    for(i=0;i<n;i++)        if(in[inL+i]==root) break;    int L=i;    int R=n-L-1;    solve(preL+1,inL,postL,L);  //左子树    solve(preL+1+L,inL+L+1,postL+L,R);}int main(){    for(int i=0;i<6;i++){        scanf("%d",&pre[i]);    }    for(int i=0;i<6;i++){        scanf("%d",&in[i]);    }    solve(0,0,0,6);    for(int i=0;i<6;i++){        printf("%d  ",post[i]);    }}
  • 中序后序求先序
    算法的核心在于,每次先将结点存放在当前树的第一个位置,再递归结点的子树,不断递归。

    #include "stdio.h"int in[6],post[6],pre[6];void solve(int preL,int inL,int postL,int n) //当前树的前序、中序、后序第一个元素的下标,当前树元素的个数{    if(n==0) return;    if(n==1){        pre[preL] = post[postL];        return;    }    int root = post[postL+n-1];    pre[preL] = root;    int i;    for(i=0;i<n;i++)        if(in[inL+i]==root) break;    int L = i;    int R = n-L-1;    solve(preL+1,inL,postL,L);    solve(preL+1+L,preL+L+1,postL+L,R);}int main(){    for(int i=0;i<6;i++)        scanf("%d",&in[i]);    for(int i=0;i<6;i++)        scanf("%d",&post[i]);    solve(0,0,0,6);    for(int i=0;i<6;i++){        printf("%d  ",pre[i]);    }}
原创粉丝点击