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

21 篇文章 0 订阅
6 篇文章 0 订阅

题目传送门<==戳这

首先了解树的遍历

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值