PTA Advanced 1020 Tree Traversals C++

该程序通过输入的后序和中序遍历序列,使用深度优先搜索(DFS)重建二叉树的层次结构。首先,定义两个容器存储后序和中序序列,然后利用递归在给定的序列范围内寻找子树的根节点并分割序列,最后按层次输出重建的树节点。
摘要由CSDN通过智能技术生成

参考大神做法:链接

#include <iostream>
#include <vector>

using namespace std;

std::vector<int> post,in;// 两个容器分别放后序序列和中序序列 
std::vector<int> level[30];// 容器数组,数组的每一个元素都是一个容器,容器内记录了树一层的元素 

void dfs(int postf,int postr, int inf,int inr, int currentLevel){
	if(postf>postr) return;// 退出递归的条件 
	
	// 子树的根节点是属于currentLevel这一层的
	// 子树的根节点就是该棵子树后序遍历的最后一个元素 
	level[currentLevel].push_back(post[postr]);
	
	// 在该子树的中序序列中找到子树根结点的位置
	// 同时也就确定了该棵子树的左右子树中结点的数量
	// 根据根据这个数量从post和in中截取出左右子树的序列范围 
	int index;
	for(index=inf;index<=inr;index++){
		if(in[index]==post[postr]) break;
	} 
	
	// 对左右子树进行相同的操作,注意层数+1
	dfs(postf,postf+index-inf-1, inf,index-1, currentLevel+1);
	dfs(postf+index-inf,postr-1, index+1,inr, currentLevel+1);
}

int main(int argc, char** argv) {
	int n;// 元素数量 
	cin>>n;
	
	// 限定后序序列和中序序列容器的长度
	post.resize(n);
	in.resize(n); 
	for(int i=0;i<n;i++){
		cin>>post[i];
	}
	for(int i=0;i<n;i++){
		cin>>in[i];
	}
	
	// 借助后序和中序序列完成对一棵树的深度遍历,顺便记录这棵树的层次结构
	// 前两个参数是子树后序遍历在容器中的下标范围;
	// 中间两个参数是子树中序遍历在容器中的下标范围;
	// 最后一个参数这颗子树的根节点所在的层数(层数从0开始) 
	dfs(0,n-1, 0,n-1, 0);
	
	// 按照层次输出level即可
	cout<<level[0][0];
	for(int i=1;i<30;i++){
		for(int j=0;j<level[i].size();j++){
			cout<<" "<<level[i][j];
		}
	} 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值