洛谷:P1030 [NOIP2001 普及组] 求先序排列

题目传送门<==戳这

首先了解树的遍历

dfs(深搜类)
先序遍历:根 左 右 ==>主根一定是第一个元素
中序遍历:左 根 右 ==>唯一确定一棵树的必要条件,知道主根在中序序列中的位置可以将树分成两部分
后序遍历:左 右 根 ==>主根一定是最后一个元素

bfs(广搜类)
层序遍历:
根 ==>下一层从左到右遍历 ==>下一层从左到右遍历…到最后一层

因此这道题求先序遍历就是按照 “ 根 左 右 ”的顺序输出根节点即可

上代码:

补充一下:substr ( pos , x ) 表示的是从pos位置开始(包括pos),截取长度为x的字符串(所以返回值就是这个字符串)

#include 
#include 
#include 
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);
}

如果是给出先序序列和中序序列求后序序列,同样先找到根,然后(小心截取字符串)将该部分分为:根,左子树,右子树,再按照“左 根 右 ”的顺序输出根节点即可;

你可能感兴趣的:(算法,dfs深搜,遍历,字符串,数据结构,算法,dfs,二叉树)