根据两种遍历顺序确定树结构(求后序遍历+先序遍历)

作者:C20180630_zjf

原创地址




一、原题

根据两种遍历顺序确定树结构(build-tree)

输入

第1行:二叉树的前序遍历顺序 
第2行:中序遍历顺序

输出

二叉树的后序遍历顺序

样例输入

ABCDEFGH 
CBEDAGHF

样例输出

CEDBHGFA

二、分析

这道题要运用到搜索,其代码与二分查找比较相似,要先读入,然后把字符串分成两个部分进行下一步的递归,以便用二叉树的前序遍历和中序遍历来找到二叉树的后序遍历,并通过一层一层的递归将其输出。

三、源代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string s1,s2;//定义字符串
void zjf(int l1,int r1,int l2,int r2){
    int m=s2.find(s1[l1]);//找到s1字符串中的第l1的元素在s2里的位置
    if(m>l2)//两种情况的列举与搜索
        zjf(l1+1,l1+m-l2,l2,m-1);
    if(m<r2)//两种情况的列举与搜索
        zjf(l1+m-l2+1,r1,m+1,r2);
    cout<<s1[l1];//输出答案
}
int main()
{
    cin>>s1>>s2;
    zjf(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 zjf(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]);
    zjf(x,l-1,w,w+l-1-x);
    zjf(l+1,y,w+l-x,z-1);
}
int main()
{
    scanf("%s%s",a,b);
    n=strlen(a);
    zjf(0,n-1,0,n-1);
}

猜你喜欢

转载自blog.csdn.net/palace_/article/details/80035954