18724 二叉树的遍历运算
时间限制:1000MS 代码长度限制:10KB
题型: 编程题 语言: 不限定
Description
二叉树的三种遍历都可以通过递归实现。
如果我们知道一棵二叉树的先序和中序序列,可以用递归的方法求后序遍历序列。
输入格式
两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。树的结点一律用小写字母表示。
输出格式
一个字符串,树的后序序列。
输入样例
abcde
bcade
输出样例
cbeda
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
//中序 先序
char in[10005],pre[10005];
//递归 pl先序起点 pr先序终点 il中序起点 ir中序终点
void dfs(int pl,int pr,int il,int ir) {
//出口是pl>pr
if (pl > pr)return;
//用ch存pl的元素
char ch = pre[pl];
int i;
//在中序中找到ch的位置
for (i = il; i<= ir;i++) {
if (in[i] == ch)break;
}
//找到后两边即分为左子树和右子树
//左子树长度
int lenl = i - il;
//右子树长度
int lenr = ir - i;
//递归左子树和右子树
//此时左子树 先序起点 先序终点 中序起点 中序终点
dfs(pl + 1, pl + lenl, il, il + lenl-1);
//此时右子树 先序起点 先序终点 中序起点 中序终点
dfs(pl + lenl +1,pr, i + 1, ir);
//递归完后输出ch
cout <<ch ;
}
int main()
{
//从下标1开始输入
cin >> (pre + 1) >> (in + 1);
//长度下标要+1
int len1=strlen(pre + 1);
int len2=strlen(in + 1);
//递归
dfs(1, len1, 1, len2);
}