概念
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
二叉树的特点:
- 每个结点最多有两棵子树,即二叉树不存在度大于2的结点。
- 二叉树的子树有左右之分,其子树的次序不能颠倒。
题目
P1030 [NOIP2001 普及组] 求先序排列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
分析
首先,后序遍历的最后一个字符就是根,因此要在中序遍历中找到它,就知道左右子数的先序和后序遍历了。这样就可以把二叉树构造出来,然后再搞一搞递归遍历。
换言之,先在后序遍历找到树根,从而找出左右子树节点,然后递归左右子数
其实主要就是熟悉树的结构 然后对其递归就没有什么太大问题了
还有一个方式就是用二叉搜索树 来还原整个树 之后再来判断
题解
#include<bits/stdc++.h>
using namespace std;
void beford(string in,string after){
if (in.size()>0){
char ch=after[after.size()-1];
cout<<ch;
int k=in.find(ch);
beford(in.substr(0,k),after.substr(0,k));
beford(in.substr(k+1),after.substr(k,in.size()-k-1));
}
}
int main(){
string inord,aftord;
cin>>inord;cin>>aftord;
beford(inord,aftord);cout<<endl;
return 0;
}
上面是我用第一种思路写的代码 简单来说就是dfs 递归
后面的二叉搜索树 其实应该更加的好理解
cs202 zhoujie