二叉树前序中序或中序后序建树

         问题:已知前序中序遍历构建二叉树

         因为前序遍历中的根为第一个在中序遍历中找到根的下标将中序遍历分成两部分,左边为左子树,右边为右子树。前序遍历中第二个为左子树的根,以此类推递归求解。

         后续遍历根在最后,倒数第二个为右子树的根,同理可求。


#include<stdio.h>
#include<stdlib.h>
#define N 7
typedef struct Node Tree;
struct Node{
  int x;
  Tree* left;
  Tree* right;
};
int t;//记录数组pre或post的位置,t对应的都为root
Tree *tree_insert(Tree *T, int x);
void tree_print(Tree *T);
//返回a[p,r]中等于x的下标
int find(int a[], int x, int p, int r);
//已知前序,中序遍历建树,p为数组mid最左下标,r为数组mid最右下标
Tree *build1(Tree *T, int pre[], int mid[], int p, int r);
//已知中序,后序遍历建树,p为数组mid最左下标,r为数组mid最右下标
Tree *build2(Tree *T, int mid[], int post[], int p, int r);

int main(int argc, char *argv[])
{
  int i;
  Tree *T=NULL;
  int a[N]={6,2,8,1,4,3,5};
  int pre[N]={6,2,1,4,3,5,8};
  int mid[N]={1,2,3,4,5,6,8};
  int post[N]={1,3,5,4,2,8,6};
  //for(i=0;i<7;++i)
  //  T=tree_insert(T,a[i]);
  //t=0;
  //T=build1(T,pre,mid,0,6);
  t=N-1;
  T=build2(T,mid,post,0,6);
  tree_print(T);
  return 0;
}
Tree *build2(Tree *T, int mid[], int post[], int p, int r)
{
  int index;
  if(p==r){
    T=(Tree *)malloc(sizeof(Tree));
    T->x=post[t--];
    T->left=NULL;T->right=NULL;
    return T;
  }
  index=find(mid,post[t],p,r);
  T=(Tree *)malloc(sizeof(Tree));
  T->x=post[t--];
  T->right=build2(T->right,mid,post,index+1,r);
  T->left=build2(T->left,mid,post,p,index-1);
  return T;
}
Tree *build1(Tree *T, int pre[], int mid[], int p, int r)
{
  int index;
  if(p==r){
    T=(Tree *)malloc(sizeof(Tree));
    T->x=pre[t++];
    T->left=NULL;T->right=NULL;
    return T;
  }
  index=find(mid,pre[t],p,r);
  T=(Tree *)malloc(sizeof(Tree));
  T->x=pre[t++];
  T->left=build1(T->left,pre,mid,p,index-1);
  T->right=build1(T->right,pre,mid,index+1,r);
  return T;
}
int find(int a[], int x, int p, int r)
{
  int i=0;
  for(i=0;i<N;++i)
    if(x==a[i])
      return i;
}
Tree *tree_insert(Tree *T, int x)
{
  if(T==NULL){
    T=(Tree *)malloc(sizeof(Tree));
    T->x=x;
    T->left=NULL;T->right=NULL;
    return T;
  }
  else if(x<T->x)
    T->left=tree_insert(T->left,x);
  else
    T->right=tree_insert(T->right,x);
  return T;
}
void tree_print(Tree *T)
{
  if(T==NULL)
    return;
  //printf("%d ",T->x);
  tree_print(T->left);
  printf("%d ",T->x);
  tree_print(T->right);
  //printf("%d ",T->x);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值