CSP历年复赛题-P1030 [NOIP2001 普及组] 求先序排列
原题链接:https://www.luogu.com.cn/problem/P1030
题意解读:已知中序、后序,求先序。
解题思路:
与洛谷题单指南-二叉树-P1827 [USACO3.4] 美国血统 American Heritage非常类似,不在介绍过程,直接给出代码。
100分代码:
#include <bits/stdc++.h>
using namespace std;
string in, post;
//in_l:中序序列的起点,in_r:中序序列的终点,post_l:后序序列的起点,post_r:后序序列的终点
void preorder(int in_l, int in_r, int post_l, int post_r)
{
if(in_l > in_r) return; //没有节点
//先通过后序序列找根节点
int root = post_r; //根节点位置为后序序列终点
//在中序序列中找到根节点的位置
int i = in_l;
while(in[i] != post[root]) i++;
cout << post[root]; //递归之前输出根即前序遍历
// in_l ~ i-1即左子树的中序序列, 一共有i-in_l个元素
// i+1 ~ in_r即右子树的中序序列, 一共有in_r-i个元素
// post_l ~ post_l+i-in_l-1即左子树的后序序列
// post_l+i-in_l ~ post_r-1即右子树的后序序列
preorder(in_l, i - 1, post_l, post_l + i - in_l - 1); //对左子树递归调用找根
preorder(i + 1, in_r, post_l + i - in_l, post_r - 1); //对右子树递归调用找根
}
int main()
{
cin >> in >> post;
preorder(0, in.size() - 1, 0, post.size() - 1);
return 0;
}
分类:
CSP-J复赛真题解析
标签:
二叉树
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?