由一棵二叉树的中序与后序排列求出它的先序排列

题目链接:https://ac.nowcoder.com/acm/problem/14360

Description

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。

Input

两行,每行一个字符串,分别表示中序和后序排列

Output

一个字符串,表示所求先序排列

Sample Input
BADC
BDCA
Sample Output
ABCD
Solution

众所周知,二叉树的三种遍历方式
先序遍历:根–>左–>右
中序遍历:左–>根–>右
后序遍历:左–>右–>根
其实就是访问根结点的顺序决定的。

显然后序排列的最后一个字符是根结点位置的字符,这时候我们去遍历中序排列,找到其中与后序排列的最后一个字符相同的字符,那么在中序排列中这个位置的字符就是根结点位置的字符,在中序排列中这个位置前面的字符构成左子树,后面的字符构成右子树。
那我们由此递归求解就好,不断的重复上面所说的操作。找到根节点就将它输出,递归时,将左子树,右子树重新看成一个独立的树,去找到根节点,找到就将它输出。直到递归结束。说白了就是套娃

Code
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
string a, b;
void before( int hl, int hr,int zl, int zr)
{
    if (zl == zr) {
        return;
    }
    int flag=-1;
    for (int i = 0; i < zr; i++) {
        if (a[i] == b[hr - 1]) {
            flag = i;
            cout << a[flag];
            break;
        }
    }
     before( hl, hl  + flag- zl,zl, flag);        //左子树
     before(hl+ flag - zl, hr - 1,flag + 1, zr);  //右子树
}
int main()
{
    cin >> a >> b;
    before( 0, b.length(),0, a.length());
}

猜你喜欢

转载自blog.csdn.net/buibuilili/article/details/107624601