根据两种遍历顺序确定树结构

8 篇文章 1 订阅
6 篇文章 0 订阅

#一、原题
##根据两种遍历顺序确定树结构(build-tree)
###输入
第1行:二叉树的前序遍历顺序
第2行:中序遍历顺序
###输出
二叉树的后序遍历顺序
###样例输入
ABCDEFGH
CBEDAGHF
###样例输出
CEDBHGFA
#二、分析
这道题要运用到搜索,其代码与二分查找比较相似,要先读入,然后把字符串分成两个部分进行下一步的递归,以便用二叉树的前序遍历和中序遍历来找到二叉树的后序遍历,并通过一层一层的递归将其输出。
#三、源代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string s1,s2;//定义字符串
void rebuild(int l1,int r1,int l2,int r2){
	int m=s2.find(s1[l1]);//找到s1字符串中的第l1的元素在s2里的位置
	if(m>l2)//两种情况的列举与搜索
		rebuild(l1+1,l1+m-l2,l2,m-1);
	if(m<r2)//两种情况的列举与搜索
		rebuild(l1+m-l2+1,r1,m+1,r2);
	cout<<s1[l1];//输出答案
}
int main()
{
	cin>>s1>>s2;
	rebuild(0,s1.length()-1,0,s2.length()-1);
	//length代表s1,s2的长度
}

#拓展
##先序序列
###题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8)。

###输入
输入格式:第一行为二叉树的中序序列
第二行为二叉树的后序序列

###输出
输出格式:一行,为二叉树的先序序列

###样例输入
BADC
BDCA

###样例输出
ABCD

思路和上一题差不多,都是根据两种遍历顺序建树。
下面是源代码:

#include<cstdio>
#include<cstring>
using namespace std;
char a[10],b[10];
int n;
void rebuild(int x,int y,int w,int z){
    if(x>y) return;
    int l;
    for(int i=x;i<=y;i++)
        if(a[i]==b[z]){l=i;break;}
    printf("%c",a[l]);
    rebuild(x,l-1,w,w+l-1-x);
    rebuild(l+1,y,w+l-x,z-1);
}
int main()
{
    scanf("%s%s",a,b);
    n=strlen(a);
    rebuild(0,n-1,0,n-1);
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值