首页 > 其他分享 >二叉树已知前中序,求后序

二叉树已知前中序,求后序

时间:2023-05-30 17:37:09浏览次数:30  
标签:pre 遍历 string 后序 int inn 前中序 二叉树 define

[USACO3.4] 美国血统 American Heritage

题目描述

农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛 们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而 不是用图形的方法。

你的任务是在被给予奶牛家谱的“树中序遍历”和“树前序遍历”的符号后,创建奶牛家谱的“树的 后序遍历”的符号。每一头奶牛的姓名被译为一个唯一的字母。(你可能已经知道你可以在知道树的两 种遍历以后可以经常地重建这棵树。)显然,这里的树不会有多于 26 个的顶点。 这是在样例输入和 样例输出中的树的图形表达方式:

         C
         /  \
        /  \
       B    G
      / \  /
       A   D  H
        / \
       E   F

树的中序遍历是按照左子树,根,右子树的顺序访问节点。

树的前序遍历是按照根,左子树,右子树的顺序访问节点。

树的后序遍历是按照左子树,右子树,根的顺序访问节点。

输入格式

第一行: 树的中序遍历

第二行: 同样的树的前序遍历

输出格式

单独的一行表示该树的后序遍历。

样例 #1

样例输入 #1

ABEDFCHG
CBADEFGH

样例输出 #1

AEFDBHGC

提示

题目翻译来自NOCOW。

USACO Training Section 3.4

题解

#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define ppb pop_back
#define SZ(v) ((int)v.size())
#define pii pair<int, int>
typedef long long ll;
typedef unsigned int u32;
typedef unsigned long long u64;
typedef double db;
using namespace std;
const int N = 1e4+10;
int _;

string s1, s2;

void dfs(string pre, string inn) {
    if(pre.empty()) return;
    char root = pre[0];
    pre = pre.substr(1);
    int k = inn.find(root);
    string pre_l = pre.substr(0, k);
    string pre_r = pre.substr(k);
    string inn_l = inn.substr(0, k);
    string inn_r = inn.substr(k+1);
    dfs(pre_l, inn_l);
    dfs(pre_r, inn_r);
    cout << root;
}

void solve() {
    cin >> s2 >> s1;
    dfs(s1, s2);

}   
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr); 
    _ = 1;
    // cin >> _;
    while(_--) {
        solve();
    }
    return 0;
}

标签:pre,遍历,string,后序,int,inn,前中序,二叉树,define
From: https://www.cnblogs.com/zhyyyyy115/p/17443837.html

相关文章

  • 打印树形结构(可视化二叉树)
    平时开发时,偶尔会操作二叉树,而查看二叉树的结构,是一种比较费时的事情,我们可以把它按照本身的结构打印出来,从而方便查看。例如Nodea=newNode(110);Nodeb=newNode(105);Nodec=newNode(115);Noded=newNode(102);Node......
  • 代码随想录算法训练营第21天 | ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中
     第六章 二叉树part07今日内容    详细布置   530.二叉搜索树的最小绝对差  需要领悟一下二叉树遍历上双指针操作,优先掌握递归 题目链接/文章讲解:视频讲解:  501.二叉搜索树中的众数  和 530差不多双指针思路,不过 这里涉及到一个很巧妙的代码......
  • 代码随想录算法训练营第15天 | ● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉
     第六章二叉树 part02 今日内容:  ●  层序遍历  10 ●  226.翻转二叉树 ●  101.对称二叉树 2    详细布置   层序遍历  看完本篇可以一口气刷十道题,试一试, 层序遍历并不难,大家可以很快刷了十道题。 题目链接/文章讲解/视频讲解:htt......
  • 代码随想录算法训练营第16天 | ● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111
     第六章二叉树part03 今日内容:  ●  104.二叉树的最大深度  559.n叉树的最大深度●  111.二叉树的最小深度●  222.完全二叉树的节点个数 迭代法,大家可以直接过,二刷有精力的时候 再去掌握迭代法。  详细布置   104.二叉树的最大深度 (优先掌......
  • 代码随想录算法训练营第17天 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404
     第六章二叉树part04 今日内容:  ●  110.平衡二叉树 ●  257. 二叉树的所有路径 ●  404.左叶子之和   详细布置  迭代法,大家可以直接过,二刷有精力的时候 再去掌握迭代法。  110.平衡二叉树 (优先掌握递归) 再一次涉及到,什么是高度,什么是......
  • LeetCode 617. 合并二叉树
    题目链接:LeetCode617.合并二叉树题意:给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新......
  • 代码随想录算法训练营第二十天|654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树
    【参考链接】654.最大二叉树【注意】1.构造二叉树,都需要用前序遍历。2.二叉树的根是数组中的最大元素。3.没必要构造新数组,通过下标控制左右区间。运行效率会高很多。【代码】1#Definitionforabinarytreenode.2#classTreeNode(object):3#def__init......
  • 5_27打卡_树的非递归前中后序遍历
    #include<iostream>#include<queue>#include<stack>usingnamespacestd;typedefstructtree{ chardata; tree*lchild; tree*rchild;}tree;//递归实现创建树voidcreatTree(tree*&root){ charch; cin>>ch; if(ch=='0&......
  • leetcode: 对称二叉树
    题目描述给你一个二叉树的根节点 root ,检查它是否轴对称。示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false提示:树中节点数目在范围 [1,1000] 内-100<=Node.val<=100题目地址:对称二叉树思路遍历每一个节......
  • 代码随想录算法训练营第十七天|110. 平衡二叉树、257. 二叉树的所有路径
    【参考链接】110.平衡二叉树【注意】1.一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。2.求高度一定要用后序遍历。【代码】1#Definitionforabinarytreenode.2#classTreeNode(object):3#def__init__(self,va......