P1030 树的先序 中序 后序遍历

[NOIP2001 普及组] 求先序排列

题目描述

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

输入格式

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

输出格式

共一行一个字符串,表示一棵二叉树的先序。

样例 #1

样例输入 #1

BADC
BDCA

样例输出 #1

ABCD

利用 后序遍历 根在最后的特点 在中序中找到对应根 根据中序算出左右子树的大小 然后算出后序中左右子树的范围 递归 输出根节点 遍历左右子树即可

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
void dfs(int l1,int r1,int l2,int r2) { // s2[r2] is the root
	if(l1==r1) {
		cout<<s1[l1];
		return ;
	}
	if(l1>r1||l2>r2)return ;
	cout<<s2[r2];
	int pos;
	for(int i=l1; i<=r1; i++)
		if(s1[i]==s2[r2]) {
			pos=i;
			break;
		}
	dfs(l1,pos-1,l2,r2-r1+pos-1);
	dfs(pos+1,r1,r2-r1+pos,r2-1);
}
signed main() {
	ios::sync_with_stdio(false);
	cin>>s1>>s2;
	int l1=s1.size(),l2=s2.size();
	s1=" "+s1,s2=" "+s2;
	dfs(1,l1,1,l2);
	return 0;
}
posted @ 2023-04-25 23:04  N0zoM1z0  阅读(3)  评论(0编辑  收藏  举报