当前位置: 代码迷 >> 综合 >> 洛谷 P1827 [USACO3.4]美国血统 American Heritage【由前序遍历和中序遍历,得到后序遍历】
  详细解决方案

洛谷 P1827 [USACO3.4]美国血统 American Heritage【由前序遍历和中序遍历,得到后序遍历】

热度:98   发布时间:2023-12-02 15:29:24.0

做题地址:https://www.luogu.com.cn/problem/P1827


这一题是给定一棵二叉树的前序遍历和中序遍历,让我们求得他的后序遍历的结果

首先我们要明白的一点是,遍历是怎么实现的。
前序遍历:
按照根、左子树、右子树的顺序访问节点
中序遍历:
按照左子树、根、右子树的顺序访问节点
后序遍历:
按照左子树、右子树、根的顺序访问节点


在做这个题的时候,我们要注意的一点是,怎么通过前序遍历和中序遍历来得到后序遍历

1我们找到前序遍历的第一个节点,记它为root,他就是当前子树的根节点,然后再在中序遍历中找到root,root左边的就是左子树,root右边的就是右子树。
这是第一步,我们找到了当前树的左子树和右子树以及根节点。
我们接下来就是重复上次操作,并按照左子树、右子树、根的顺序来依次输出即可。

下面是代码

#include <bits/stdc++.h>using namespace std;string inor, pre;void traverse(string pre, string inor){if (pre.empty()) return;char root = pre[0];int k = inor.find(root);pre.erase(pre.begin());string leftpre = pre.substr(0, k);string rightpre = pre.substr(k);string leftinor = inor.substr(0, k);string rightinor = inor.substr(k + 1);traverse(leftpre, leftinor);traverse(rightpre, rightinor);cout << root ;
}
int main(){cin >> inor >> pre;traverse(pre, inor);return 0;
}