洛谷题单-美国血统

P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

分析:

已知前序遍历和中序遍历,求后序遍历

1.后序遍历:左右根

2.通过前序找根节点、用这个根节点在中序中分左右

3.递归处理(重复步骤2),最后输出root即可

学到新知识:(有关字符串的各种处理)

1.string.substr(int start,int num) -- return string;

2.string.find(char c) -- return int;

3.string.erase(iterator)

代码

#include<iostream>
#include<string>
using namespace std;

void f(string pre,string mid)
{
	if(pre.empty()) return;
	char c = pre[0];  //保存根节点
	int id = mid.find(c);  //得到切割点,这个点左边是左子树(共id个节点),右边是右子树
	pre.erase(pre.begin());
	string lp = pre.substr(0,id);  //左子树(id个节点)
	string rp = pre.substr(id);  //剩下的为右子树
	string lm = mid.substr(0,id);
	string rm = mid.substr(id + 1);
	f(lp,lm);  //递归处理左
	f(rp,rm);  //处理右
	cout << c;  //最后输出根
}

int main()
{
	string pre,mid;
	cin >> mid >> pre;
	f(pre,mid);
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值