前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >P1030 求先序排列 【STL,二叉树遍历】

P1030 求先序排列 【STL,二叉树遍历】

作者头像
Lokinli
发布2023-03-09 13:38:01
1830
发布2023-03-09 13:38:01
举报
文章被收录于专栏:以终为始

https://www.luogu.com.cn/problem/P1030

题目描述

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度\le 8≤8)。

输入格式

22行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。

输出格式

11行,表示一棵二叉树的先序。

输入输出样例

输入 #1复制

代码语言:javascript
复制
BADC
BDCA

输出 #1复制

代码语言:javascript
复制
ABCD

题解:二叉树的遍历分别如下:

前序 :根 - 左 - 右

中序:左 - 根 - 右

后序:左 - 右 - 根

现在已经知道了后序和中序,想输出前序,对于后序来说,每次最后一个就是根,直接输出就得到了整棵树的根,然后左右子树分别递归,递归的时候就需要靠中序将两部分分开。然后同样的方式处理左右子树。

这里的左右递归没有去建立二叉树,通过STL可以直接查询进行递归。

代码思路来自洛谷题解。

代码语言:javascript
复制
#include <bits/stdc++.h>

using namespace std;

void solve(string a, string b) // a 是中序,b 是后序
{
    if(a.size() > 0)
    {
        char ch = b[b.size() - 1]; // 最后一个数是根节点的数
        cout << ch; // 输出
        int k = a.find(ch); // 找到根节点在中序中的位置
        solve(a.substr(0,k),b.substr(0,k)); // 左子树递归
        solve(a.substr(k+1),b.substr(k,b.size() -k -1)); // 右子树递归
    }
}
int main()
{
    string a,b;
    cin >> a >> b;
    solve(a,b);
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • https://www.luogu.com.cn/problem/P1030
  • 题目描述
  • 输入格式
  • 输出格式
  • 输入输出样例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档