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

    科技2022-08-16  124

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

    题目描述

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

    输入格式

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

    输出格式

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

    输入输出样例

    输入 #1复制

    BADC BDCA

    输出 #1复制

    ABCD

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

    前序 :根 - 左 - 右

    中序:左 - 根 - 右

    后序:左 - 右 - 根

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

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

    代码思路来自洛谷题解。

    #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; }

     

    Processed: 0.008, SQL: 9