蓝桥杯 ALGO-20 求先序排列 (二叉树的遍历特点)

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
【输入形式】
 两行,每行一个字符串,分别表示中序和后序排列
【输出形式】
一个字符串,表示所求先序排列
【样例输入】

BADC
BDCA

【样例输出】

ABCD

解题思路:
二叉树的后序遍历最后一个结点一定是这个二叉树的根结点,所以我们先在后序遍历BDCA中找到最后一个结点A,输出它,然后在先序遍历BADC中找到A的位置pos,pos左边就是A的左子树,右边就是右子树,对左右子树分别递归进行上述过程,就能得到先序遍历的结果。
有个关键点:在中序遍历中pos位置左边的结点是根结点左子树的中序遍历结果,在后序遍历中pos位置左边的结点是根节点左子树的后序遍历结果,pos右边的结点也同理。如图所示:
在这里插入图片描述
代码中使用了#include中的find()函数和substr()函数

find()
str.find©;//在str1中查找字符c并返回第一个查找到的地址

substr(size_t pos = 0, size_t len = npos)
str2 = str1.substr(pos,len) 将str1中从pos位置开始的长度为len的字符串拷贝给str2,若不填len,默认拷贝到str1结尾

代码如下:

#include<iostream>
#include<string>
using namespace std;

void PreOrderRecu(string str1,string str2) {
    
    
	int len1 = str1.size();
	int len2 = str2.size();
	if (len1 > 0) {
    
    
		char ch = str2[len2 - 1];//根节点
		cout << ch;//输出根节点
		int pos = str1.find(ch);//在str1中找到ch出现的位置
		PreOrderRecu(str1.substr(0, pos), str2.substr(0, pos));//递归左子树
		PreOrderRecu(str1.substr(pos + 1), str2.substr(pos, len2 - 1 - pos));//递归右子树
	}
}




int main() {
    
    
	string str1, str2;
	getline(cin, str1);
	getline(cin, str2);
	PreOrderRecu(str1, str2);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/sgsx11/article/details/114789868
今日推荐