根據兩種遍歷順序確定樹結構(求後序遍歷+先序遍歷)

作者: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);
}
發佈了28 篇原創文章 · 獲贊 23 · 訪問量 5258
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章