恢复二叉树

由前序中序遍历序列恢复二叉树,并按后序序列输出。前序中序序列存在s1,s2字符数组中,各字符代表节点且不相同:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct Tree
{
        char date;
        Tree *lchild;
        Tree *rchild;
};
char s1[30],s2[30];
int len;
int value[260];
void v()    //记录不同字符在s2中位置
{
        for(int i=0;i<len;i++)
        value[s2[i]]=i;         
}
Tree *search(int left,int right)    //查询子树的父节点并返回其指针
{
        Tree *p;
        p=NULL;
        for(int i=0;i<len;i++)
                if(value[s1[i]]>=left&&value[s1[i]]<=right)
                {
                        p=(Tree *)malloc(sizeof(Tree));
                        p->date=s1[i];
                        break;          
                }
        return p;
}
void creat(int left,int right,Tree *root)    //恢复二叉树
{
        int mid;
        for(int i=0;i<len;i++)
            if(s2[i]==root->date)
            {
                        mid=i;
                        break;
                }
        if(mid-1>=left)
    {
                Tree *p1=search(left,mid-1);
                root->lchild=p1;
                creat(left,mid-1,p1);
        }
        else
                root->lchild=NULL;
        if(mid+1<=right)
        {
            Tree *p2=search(mid+1,right);
                root->rchild=p2;
                creat(mid+1,right,p2);
        }
        else
                root->rchild=NULL;
}
void print(Tree *root)    //按后序遍历序列输出
{
        if(root->lchild!=NULL)
            print(root->lchild);
        if(root->rchild!=NULL)
            print(root->rchild);
        printf("%c",root->date);
} 
int main()
{
        while(scanf("%s%s",s1,s2)!=EOF)
        {
                len=strlen(s1);
                memset(value,-1,sizeof(value));
                v();
                          
                root=search(0,len-1);
                creat(0,len-1,root);
                print(root);
                printf("\n");   
        }
} 
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值