18724 二叉树的遍历运算
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC;VC;JAVA;PYTHON
Description
二叉树的三种遍历都可以通过递归实现。 如果我们知道一棵二叉树的先序和中序序列,可以用递归的方法求后序遍历序列。
输入格式
两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。 树的结点一律用小写字母表示,且字符串长度不超过30。
输出格式
一个字符串,树的后序序列。
输入样例
abcde bcade
输出样例
cbeda
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <string>
using namespace std;
int n; // 全局变量n(虽然在这个代码中未使用)
// 深度优先搜索函数,根据先序和中序遍历序列生成后序遍历序列
// 参数:
// pre: 先序遍历序列
// mi: 中序遍历序列
// 返回值:
// 后序遍历序列
string dfs(string pre, string mi) {
// 如果任一序列为空,返回空字符串(递归终止条件)
if(pre.empty() || mi.empty()) {
return "";
}
// 先序序列的第一个元素是当前子树的根节点
char root = pre[0];
// 在中序序列中找到根节点的位置
int vi = mi.find(root);
// 分割中序序列:
// p: 左子树的中序序列(根节点左边的部分)
// q: 右子树的中序序列(根节点右边的部分)
string p = mi.substr(0, vi);
string q = mi.substr(vi + 1);
// 分割先序序列:
// pp: 左子树的先序序列(跳过根节点后,取与左子树中序序列相同长度的部分)
// qq: 右子树的先序序列(剩余部分)
string pp = pre.substr(1, p.size());
string qq = pre.substr(p.size() + 1);
// 递归处理左子树和右子树,得到它们的后序序列
string ppre = dfs(pp, p); // 左子树的后序
string qpre = dfs(qq, q); // 右子树的后序
// 后序遍历的顺序:左子树后序 + 右子树后序 + 根节点
return ppre + qpre + root;
}
int main() {
// 优化输入输出
ios::sync_with_stdio(false);
cin.tie(nullptr);
string pre, mi; // 存储输入的先序和中序序列
cin >> pre; // 读取先序序列
cin >> mi; // 读取中序序列
// 调用dfs函数生成后序序列并输出
cout << dfs(pre, mi);
return 0;
}
1531

被折叠的 条评论
为什么被折叠?



