(Luogu) P1087 FBI树 P1030 求先序排列

本文详细解析了洛谷P1087与P1030两道算法题的解决方案,涵盖树的创建、遍历(包括后序、中序和前序遍历)及二叉树节点识别等核心概念。通过实例讲解,深入理解二叉树的构造与遍历技巧。

https://www.luogu.org/problemnew/show/P1087

#include<bits/stdc++.h>
using namespace std;
string s[4000],ff;
int N;
void pd(string xx){
	bool flag0=0,flag1=0;
	for(int i=0;i<xx.size();++i){
		if(flag0 && flag1)	break;
		if(xx[i]=='1')	flag1=1;
		else flag0=1;
	}
	if(flag0&&flag1)	cout<<'F';
	else if(flag1)	cout<<'I';
	else	cout<<'B';
}
void CreatTree(string tt,int dep){
	if(tt.size()==1){
		s[dep]=tt;
		return;
	}
	else{
		s[dep]=tt;
		string le=tt.substr(0,tt.size()/2);
		string ri=tt.substr(tt.size()/2,tt.size()/2);
		CreatTree(le,dep<<1);
		CreatTree(ri,dep<<1|1);
	}
}
void postOrde(int dep) {
	if(s[dep].size()==1){
		pd(s[dep]);
		return ;
	}
	else {
		postOrde(dep<<1);
		postOrde(dep<<1|1);
		pd(s[dep]);
	}
}
int main(){
	cin>>N>>ff;
	if(ff.size()==1)	pd(ff);
	else{
		CreatTree(ff,1);
		postOrde(1);
	}
	return 0;
}

树的建立和三种遍历https://blog.youkuaiyun.com/TDD_Master/article/details/83186422

 

更新下划线——————————————————————————————

https://www.luogu.org/problemnew/show/P1030#sub

后序遍历时 根节点总是在最后被访问到。

那中序遍历 根节点的左右两侧的点恰是它的左右子树。

所以利用这一点就可以求出前序遍历 那例子举个栗子

中序: BADC
后序: BDCA

根据后序第一个输出的肯定是A,然后看中序,A的左边是B(即左枝),右边是DC(即右枝)

先递归左枝,左枝的中序遍历是B,后序遍历也是B,输出B。递归右枝,中序遍历是DC,后序遍历是DC

先输出根C,递归左枝(输出D),右枝无。一层层下去,前序遍历就输出出来了。

 

#include<bits/stdc++.h>
#include<string>
using namespace std;
string mmm,pos;
void dfs(string m,string p){
	if(p.size()==1){
		cout<<p;
		return ;
	}
	cout<<p[p.size()-1];
	int i;
	for(i=0;i<m.size();++i){
		if(m[i]==p[p.size()-1]){
			break;
		}
	}
	if(i>0){//有左枝 
		string lm=m.substr(0,i),lp=p.substr(0,i);
		dfs(lm,lp);
	}
	if(i<m.size()-1){//有右枝 
		string rm=m.substr(i+1),rp=p.substr(i,p.size()-i-1);
		dfs(rm,rp);
	}
}
int main(){
	cin>>mmm>>pos;
	dfs(mmm,pos);
}

 

要在洛谷平台上查找已知后遍历和中遍历遍历的相关题目、解答或资料,可以按照以下步骤操作: 1. **访问洛谷官网**:打开浏览器,访问洛谷的官方网站(https://www.luogu.com.cn/ )。 2. **使用搜索功能**:在洛谷网站的搜索框中输入与“已知后遍历和中遍历遍历”相关的关键词,例如“后遍历”、“后构造”等。 3. **筛选搜索结果**:在搜索结果中,筛选出题目、题解、博客等不同类型的内容。通常,题目会有相应的编号和标题,题解会有详细的解题思路和代码实现,博客可能会有更深入的分析和讲解。 4. **查看题目和解答**:点击感兴趣的题目或解答链接,查看具体内容。对于题目,可以尝试自己解决,然后参考题解来验证自己的思路和代码;对于解答,可以学习其中的算法和技巧。 以下是一个示例的Python代码,用于根据后遍历和中遍历遍历: ```python def buildTree(inorder, postorder): if not inorder or not postorder: return [] root_val = postorder[-1] root_index = inorder.index(root_val) left_inorder = inorder[:root_index] right_inorder = inorder[root_index + 1:] left_postorder = postorder[:root_index] right_postorder = postorder[root_index:-1] left_preorder = buildTree(left_inorder, left_postorder) right_preorder = buildTree(right_inorder, right_postorder) return [root_val] + left_preorder + right_preorder # 示例使用 inorder = [4, 2, 5, 1, 6, 3, 7] postorder = [4, 5, 2, 6, 7, 3, 1] preorder = buildTree(inorder, postorder) print(preorder) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值