树与二叉树之还原二叉树

#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#define max 100
typedef struct BiTNode{
 char data;
 struct BiTNode * lchild;
 struct BiTNode * rchild;
}BiTNode,* BiTree;
int Find(char x,char *zhong,int n)
{
    for(int i=0;i<n;i++)
    {
        if(zhong[i]==x)
        {
            return i;
        }
    }
}
 
 
BiTNode *build(int n,char *xian,char *zhong)//给出先序与中序,可以确定二叉树,n代表某次调用传入的节点数
{
    if(n==0) return NULL;
    char c=xian[0];
    int index=Find(c,zhong,n);//找出当前先序序列中第一个节点(某个树的根节点)在中序中的位置
    BiTNode * tmp=(BiTNode * )malloc(sizeof(BiTNode));
    tmp->data=c;//tmp是整棵树的根节点
    tmp->lchild=build(index,xian+1,zhong);//当前节点的左子树的先序序列和中序序列传入,他们的过程是一样的,更新先序序列后的第一个即为当前节点左子树的根节点
    tmp->rchild=build(n-index-1,xian+1+index,zhong+1+index);//当前节点的右子树的先序序列和中序序列
    return tmp;
}

int Depth(BiTree T){//函数名和内部变量同名引发错误depth
   int depth;
   if(!T)
     depth=0;
   else
     depth=(Depth(T->lchild) > Depth(T->rchild)? Depth(T->lchild): Depth(T->rchild))+1;
   return depth;
}

int main(){
 int n,depth;
 BiTree T;
 char pre[max],inorder[max];
 scanf("%d",&n);
 scanf("%s %s",pre,inorder);
 T=build(n,pre,inorder);
 depth = Depth(T);
 printf("%d",depth);
 return 0;
}

结尾附一个已知后序序列和中序序列,建立二叉树

BiTNode *build(int n,int *hou,int *zhong)
{
    if(n==0) return NULL;
    char c=hou[n-1];
    int index=Find(c,zhong,n);
    BiTNode * tmp=(BiTNode * )malloc(sizeof(BiTNode));
    tmp->data=c;
    tmp->lchild=build(index,hou,zhong);//当前节点的左子树的后序序列和中序序列传入
    tmp->rchild=build(n-index-1,hou+index,zhong+1+index);//当前节点的右子树的后序序列和中序序列
    return tmp;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值