scau 18724 二叉树的遍历运算

Description

二叉树的三种遍历都可以通过递归实现。
如果我们知道一棵二叉树的先序和中序序列,可以用递归的方法求后序遍历序列。

输入格式

两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。
树的结点一律用小写字母表示,且字符串长度不超过30。

输出格式

一个字符串,树的后序序列。

输入样例

abcde
bcade

输出样例

cbeda

首先,我们需要掌握根据先序和中序序列来手写树的能力。以题目所给输入样例为例

已知先序序列abcde和中序序列bcade

先序序列是先根再左再右,那么我们可以知道这棵树的根结点为a。

而中序序列是先左再根再右,我们已经知道a是根结点,那么在中序序列中,a的左边bc是a的左子树(我们先不管bc的顺序),a的右边de是a的右子树(同样,我们先不管de的顺序)

再回到先序序列,找到bc,第一个是b,而在中序里对应的b的右边是c,即c是b的右孩子

再在先序中找到de,第一个是d,而在中序里对应的d的右边是e,即e是d的右孩子

scau 18724 二叉树的遍历运算_第1张图片 这棵树就长这样啦

可能这个树比较小,大家还看不出什么规律,感兴趣的可以自己多试几个样例。

运用递归的思想,先把这棵树以a为根,分成左右两棵子树bc和de,再以b为根,又分成两棵子树……直到到了叶子结点,不能再分子树了。

可能这么说还是很抽象,看看代码就好啦。

#include 
#include 
#include 
#include 

using namespace std;

void Traverse(string pre,string in)
{
    if(pre=="\0" || in=="\0")
        return;
    int pos=in.find(pre[0]);//根据先序找到根结点在中序的位置
    Traverse(pre.substr(1,pos),in.substr(0,pos));//左子树
    Traverse(pre.substr(pos+1),in.substr(pos+1));//右子树
    cout<> pre >> in;
    Traverse(pre,in);
    return 0;
}

这个string类中的find()函数和substr()函数要是不懂的话可以去看看大佬写的解析,写的是真不错啊,第一次接触这类函数居然很容易就弄明白了,如下:

C++String中的find用法_帅帅气气的黑猫警长的博客-CSDN博客_c++ find string

C++string类中substr()函数的使用方法_&Mr.Gong的博客-CSDN博客_c++ string substr

你可能感兴趣的:(数据结构,算法,数据结构)