重建二叉树

重建二叉树

描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。
输入输入有多组数据(少于100组),以文件结尾结束。
每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法)。输出每组输出数据单独占一行,输出对应得先序序列。样例输入ACBFGED ABCDEFG
CDAB CBAD

样例输出DBACEGF
BCAD
1.1
温习如何已知二叉树的中序后序求前序:
分析:

先复习一下前序遍历, 中序遍历, 后序遍历的次序

前序遍历:1.访问根节点。2.访问左子树。3.访问右子树
中序遍历:1.访问左子树。2.访问根节点。3.访问右子树
后序遍历:1.访问左子树。2.访问右子树。3.访问根节点

先用手工试算出这个前序序列

后序遍历: ACBFGED
中序遍历: ABCDEFG
这里写图片描述

第一步:
由后序遍历知道根节点是D
第二步:
由中序序列知道左子树是{A,B,C}, 右子树是{E,F,G}
重复一二两步,
知道E是右子树的根节点,并存在右子树,没有左子树
这里写图片描述
反复套用一二两步规则,最终可得到整颗树
1.2
思路分析(是一位大神的思路 非常好理解)

1.后序:存数组a  中序:存数组b 
2.递归函数:void recover(int root,int start,int end)
  root代表根节点在a中的位置  start表示b所操作部分的起始位置
 3.遍历b 找到根节点的位置 用i储存
 4.打印根节点
 5.递归左子树
 ps:这时候要传的start,end,root是针对左子树ABC来说的
 root=root-(end-i)-1;start不变;end=i-1;
 6.递归右子树
ps: 同样针对EFG
 root=root-1;start=i+1;end不变
 注意:当end==start时 当前节点已经是叶子节点了 所以start>end是结束条件

1.3
代码总览:

//重建二叉树 已知后序和中序求先序 
#include <stdio.h>
#include <string.h>
char a[1000],b[1000];
void recover(int root,int start,int end)
{
   if(start>end) return;
   int i=start;//i用来遍历
   while(i<end&&b[i]!=a[root])//遍历b找到根节点 
     i++; 
   printf("%c",a[root]);//打印根节点
    recover(root-(end-i)-1,start,i-1);//遍历左子树
    recover(root-1,i+1,end);//遍历右子树 
} 
int main()
{
    while(scanf("%s",a)!=EOF)
    {
        scanf("%s",b);
        int l=strlen(a);
        recover(l-1,0,l-1);
        printf("\n"); 
    }
    return 0;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值