题目传送门<==戳这
首先了解树的遍历
dfs(深搜类)
先序遍历:根 左 右 ==>主根一定是第一个元素
中序遍历:左 根 右 ==>唯一确定一棵树的必要条件,知道主根在中序序列中的位置可以将树分成两部分
后序遍历:左 右 根 ==>主根一定是最后一个元素
bfs(广搜类)
层序遍历:
根 ==>下一层从左到右遍历 ==>下一层从左到右遍历…到最后一层
因此这道题求先序遍历就是按照 “ 根 左 右 ”的顺序输出根节点即可
上代码:
补充一下:substr ( pos , x ) 表示的是从pos位置开始(包括pos),截取长度为x的字符串(所以返回值就是这个字符串)
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
==>要注意在树的每一部分,任何类型的遍历序列长度都是一样的
void dfs(string mid,string post){
if(mid.empty()) return; ==>序列为空是递归结束的标志
else{
char root=post[post.size()-1]; ==>找到该部分的“主根”
int pos=mid.find(root); ==>“主根”在中序序列中的位置
printf("%c",root); ==>“根”
dfs(mid.substr(0,pos),post.substr(0,pos)); ==>“左”
dfs(mid.substr(pos+1),post.substr(pos,post.size()-k-1)); ==>“右”
}
}
int main(){
string mid,post; ==>中序序列,后序序列
cin>>mid>>post;
dfs(mid,post);
}
如果是给出先序序列和中序序列求后序序列,同样先找到根,然后(小心截取字符串)将该部分分为:根,左子树,右子树,再按照“左 根 右 ”的顺序输出根节点即可;