P1030 [NOIP2001 普及组] 求先序排列题解
一、已知后序+中序,求前序
求解步骤:
(1)后序遍历的字符串,尾字母是子树的根。
(2)在中序遍历字符串中找到“步骤1查找到的尾字母”,它的左边就是左子树,右边就是右子树,可以计算获得左子树长度。
(3)在后序遍历字符串中根据左子树长度,获取到左子树子串(),右子树
(4)递归就可以继续前序输出左右子树。
很多二叉树的题目,不需要真正的还原创建出二叉树,只是根据字符串,不断的递归子串,在递归过程中输出想要的结果,这样更轻量一些,代码更短。
代码原理:
C++代码
#include <bits/stdc++.h>
using namespace std;
string post_str; //后序
string in_str; //中序
//函数定义:输出给定后序遍历、中序遍历字符串的前序遍历字符串
//后序遍历的范围 l1-r1
//中序遍历的范围 l2-r2
//递归只是输出眼前自己力所能及的事情,就是把当前子树的根输出,然后再继续递归调用获取子树的前序遍历字符串
void dfs(int l1, int r1, int l2, int r2) {
//当前为空树 则直接返回,递归终止条件
if (l1 > r1 || l2 > r2) return;
//从中序遍历中找出左树的范围
int i = in_str.find(post_str[r1]);//post_str[r1]是指尾巴是根结点
//左子树节点有多少个
int cnt = i - l2;
//后序遍历的最后一个一定是节点的根,输出根的值
cout << post_str[r1];
// 递归构建左树
// 后序,中序
dfs(l1, l1 + cnt - 1, l2, i - 1);
// 递归构建右树
// 后序,中序
dfs(l1 + cnt, r1 - 1, i + 1, r2);
}
/**
BADC 中序
BDCA 后序
BADC
BDCA
参考答案:ABCD
*/
int main() {
cin >> in_str >> post_str;
int right = in_str.size() - 1; //right索引:因为是0开始,所以要-1
dfs(0, right, 0, right);
return 0;
}
二、已知前序+中序,求后序
P1827 [USACO3.4]美国血统 American Heritage 题解
https://www.cnblogs.com/littlehb/p/15088448.html
三、已知前序+后序,求中序个数
P1229 遍历问题
https://www.luogu.com.cn/problem/P1229
https://www.cnblogs.com/littlehb/p/15099843.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2018-08-02 mysql备份与还原
2017-08-02 PostgreSQL9.6.3的REDIS测试