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;
}