You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

43 lines
1.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <bits/stdc++.h>
using namespace std;
string pre_str; //前序
string in_str; //中序
//前序的第一个是根,后序是最后输出树的根 那就找一次输出一次,然后继续找出左树和右树,直到空树时停止。
/**
* 功能:对二叉树进行后序遍历.根据四个参数1确定子树的根(2)确定左右子树的大小范围3按后序进行输出递归
* @param l1 前序遍历的起点
* @param r1 前序遍历的终点
* @param l2 中序遍历的起点
* @param r2 中序遍历的终点
*/
void dfs(int l1, int r1, int l2, int r2) {
if (l1 > r1 || l2 > r2) return;//规定边界条件
int i = in_str.find(pre_str[l1]); //利用根左右的特性来在中序队列中查找
int cnt = i - l2;//左子树的节点个数
//前序l1是根左子树是从l1+1开始到l1+cnt结束
//中序l2开始到i-1结束
dfs(l1 + 1, l1 + cnt, l2, i - 1); //递归左子树
dfs(l1 + cnt + 1, r1, i + 1, r2); //递归右子树
cout << pre_str[l1]; //输出根结点
}
/**
ABEDFCHG
CBADEFGH
参考结果AEFDBHGC
*/
int main() {
//输入中序遍历,前序遍历字符串
cin >> in_str >> pre_str;
int right = in_str.size() - 1; //right索引因为是0开始所以要-1
//递归构建还原二叉树
//本题,并没有真正的进行构建二叉树,只是根据二叉树的特点,不断查找过程中,输出后序遍历的字符串
dfs(0, right, 0, right);//每个字符串有两个指针指向头和尾
return 0;
}