P1827 奶牛
题目解读
其实说到底就是一道树的后序遍历反推而已嘛
首先,让我们看一遍题目:
给了一棵树的前序中序遍历,让求出后序遍历;(习惯性的打出分号
https://oi-wiki.org/graph/tree-basic/#_14(附上OI-WIKI的讲解
首先我们知道前序遍历在开头是根节点,那么,就将根节点取出(用 string 可做到
那么,在中序遍历中找到根节点的位置,左边就是左子树,右边就是右子树
在左子树中,前序遍历的左半截的开头就是左子树的根节点,再将根节点取出,再在中序遍历的左半边寻找……
然后再在右子树中重新做一遍这个过程,(注意)重新做的时候也要从左子树开始做
!!!这是什么!!!
赤裸裸的递归啊
所以!就可以用一个递归小函数来解决这个问题
另一件事情
在上述说明中呢,看上去非常的简单;
但是,上面提到了前序遍历的左半边,难道是说要在存一个 string 做吗;
是的,需要————
但是不要惊慌
接下来我要说的就是 string 的库函数之一:substr();
substr(本质上是复制字符串的一部分放入新的字符串之中;
就省得孩子们一遍遍的 for 了
上代码
#include<bits/stdc++.h>
using namespace std;
#define N 10010
string a,b;
void dfs(string aa,string bb)
{
if(aa.empty())return; //这是在判断边界
char root=aa[0]; //将前序遍历的根节点取出来
int k=bb.find(root); //找到根节点
aa.erase(aa.begin()); //将根节点从string中删除
string laa=aa.substr(0,k),raa=aa.substr(k),lbb=bb.substr(0,k),rbb=bb.substr(k+1); //激动人心的拆卸时间
dfs(laa,lbb);dfs(raa,rbb); //遍历
cout<<root; //由于是后序遍历所以最后输出根节点
}
int main()
{
cin>>a>>b;
dfs(b,a);
cout<<endl;
return 0;
}
尾声
森森的第一篇学术博客结束