zoukankan      html  css  js  c++  java
  • [luogu p1030] 求先序排列

    传送门

    求先序排列

    题目描述

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

    输入输出格式

    输入格式

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

    输出格式

    (1)行,表示一棵二叉树的先序。

    输入输出样例

    输入样例 #1

    BADC
    BDCA
    

    输出样例 #1

    ABCD
    

    分析

    这道题要我们求出这棵二叉树的先序。而先序是根左右,左右子树也是根左右,这意味着我们要找根,递归左右子树。左右子树再找根,递归左右子树。也就是说,我们要不断找根

    怎么找根呢?很显然这个主二叉树的根就是后序遍历中最后一个。这点不难理解。接下来我们要递归左右子树,那么怎么递归左右子树呢?我们把目标定向中序遍历,中序遍历是左根右,根在中间,两边就是左右子树。也就是说我们在后序遍历找根,中序遍历递归左右子树。然后不断输出根,每递归一个左右子树就输出它的根,这样就是前序遍历了。

    叭叭叭这么多,是时候上代码了。注意字符串的截断处理。

    代码

    /*
     * @Author: crab-in-the-northeast 
     * @Date: 2020-03-09 00:02:34 
     * @Last Modified by: crab-in-the-northeast
     * @Last Modified time: 2020-03-09 09:18:02
     */
    #include <iostream>
    #include <cstdio>
    
    void work(std :: string s1, std :: string s2) {
        if(s1.size() == 0) return ;
        char root = s2[s2.length() - 1];
        std :: cout << root;
        int pos = s1.find(root);
        work(s1.substr(0, pos), s2.substr(0, pos));
        work(s1.substr(pos + 1), s2.substr(pos, s2.length() - pos - 1));
    }
    
    int main() {
        std :: string s1, s2;
        std :: cin >> s1 >> s2;
        work(s1, s2);
        return 0;
    }
    

    评测结果

    AC 100R31544805

  • 相关阅读:
    POJ1222_EXTENDED LIGHTS OUT
    SGU196_Matrix Multiplication
    ZOJ3772_Calculate the Function
    Triangle POJ
    POJ 2187 Beauty Contest(凸包,旋转卡壳)
    [Neerc2016]Mole Tunnels (模拟费用流)
    [2019ccpc网络赛】K-th occurrence(后缀数组+主席树)
    【HDU2019多校】E
    Gym
    P3160 [CQOI2012]局部极小值(dfs+状压dp)
  • 原文地址:https://www.cnblogs.com/crab-in-the-northeast/p/luogu-p1030.html
Copyright © 2011-2022 走看看