二叉树的两序求一序

不管是利用 先序中序 求后序
还是利用 中序后序 求先序
都有一个核心关键,就是利用中序遍历寻找根的位置

找到中根遍历中 根的位置记为root
那么 root-l2就是左子数的长度
所以在先序遍历中 l1+root-l2 就是左子数的起始点下标
以此类推,后序中序求先序也是类似

先序中序求后序

#include<bits/stdc++.h>
using namespace std;
string a,b;
void dfs(int l1,int r1,int l2,int r2)
{
	int root=b.find(a[l1]);   //寻找根的位置,然后利用根的位置进行分割
	
	if(root>l2)
	dfs(l1+1,root-l2+l1,l2,root-1);
	if(root<r2)
	dfs(root-l2+l1+1,r1,root+1,r2);
	
	cout<<a[l1];
}
int main()
{
	cin>>a>>b;
	dfs(0,a.size()-1,0,b.size()-1);
	return 0; 
}

后序中序求先序

#include<bits/stdc++.h>
using namespace std;
string a,b;
void dfs(int l1,int r1,int l2,int r2)
{
	int root=b.find(a[r1]); 
	cout<<a[r1];
	
	if(root>l2)
	dfs(l1,root-l2+l1-1,l2,root-1);
	if(root<r2)
	dfs(root-l2+l1,r1-1,root+1,r2);
}
int main()
{
	cin>>a>>b;
	dfs(0,a.size()-1,0,b.size()-1);
	return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值