《xzc最喜欢的二叉树》 部分数据标程 Apare_xzc

2023-10-21 02:40

本文主要是介绍《xzc最喜欢的二叉树》 部分数据标程 Apare_xzc,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《xzc最喜欢的二叉树》 部分数据&标程


题目链接:xzc最喜欢的二叉树


大致展示

输入先序遍历和中序遍历,还原二叉树,并得到后续遍历,求叶子节点的个数,树的最大深度
输入保证每个节点的值各不相同

输入的先序遍历为:ABDHIORSEJKCFLPQTUGMN
输入的中序遍历为:HDIROSBJEKAFPLTUQCMGN

先序遍历如下:A B D H I O R S E J K C F L P Q T U G M N
中序遍历如下:H D I R O S B J E K A F P L T U Q C M G N
后序遍历如下:H R S O I D J K E B P U T Q L F M N G C A

节点4(H)是叶子节点
节点7®是叶子节点
节点8(S)是叶子节点
节点10(J)是叶子节点
节点11(K)是叶子节点
节点15§是叶子节点
节点18(U)是叶子节点
节点20(M)是叶子节点
节点21(N)是叶子节点
这棵树有9个叶子节点

这棵树一共有7层,最深的一层在先序遍历中的第一个节点是:18(U)

请按任意键继续. . .


Sample Input

3
3
ABC
BAC
8
ABDFCEGH
BFDACGEH
21
ABDHIORSEJKCFLPQTUGMN
HDIROSBJEKAFPLTUQCMGN

Sample Output

Case #1:
该二叉树的后序遍历为:BCA
该二叉树的叶子节点个数为:2
该二叉树的层数为:2,最深的叶子节点的值为:BCase #2:
该二叉树的后序遍历为:FDBGHECA
该二叉树的叶子节点个数为:3
该二叉树的层数为:4,最深的叶子节点的值为:FCase #3:
该二叉树的后序遍历为:HRSOIDJKEBPUTQLFMNGCA
该二叉树的叶子节点个数为:9
该二叉树的层数为:7,最深的叶子节点的值为:U

标程std.cpp

/*
FileName: std.cpp 
Author: xzc
Date: 2020.1.27 
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 105;
const int maxm = 100+10;
char InOrder[maxn],PreOrder[maxn]; //输入的中序遍历和先序遍历 
int Lchild[maxn],Rchild[maxn],fa[maxn],n,cnt; //记录每个节点的左子节点编号,右子节点编号,父节点编号 
map<char,int> pos; 
void dfs();
void getPostOrder(int);
void CountLeaves(int,int&);
void getMaxDeep(int,int,int&,int&);
int main()
{
//	freopen("in.txt","r",stdin);
//	freopen("StdOut.txt","w",stdout); int T;scanf("%d",&T);for(int ca=1; ca<=T; ++ca){if(ca>1) printf("\n");pos.clear();scanf("%d",&n); //以连续字符串的形式读入先序遍历和中序遍历 scanf("%s",PreOrder+1);scanf("%s",InOrder+1);//初始化每个节点左右子节点均为空 memset(Lchild,-1,sizeof(Lchild));memset(Rchild,-1,sizeof(Rchild));fa[1] = 1;for(int i=1;i<=n;++i){   //预处理 pos是一个map:作用:将 pos[InOrder[i]] = i;}cnt = 1; //dfs初始化,先序遍历的第一个节点一定是根节点 dfs(); //得到每个节点Lchild,Rchild和fa的信息 //后序遍历 printf("Case #%d:\n",ca);cout<<"该二叉树的后序遍历为:"; getPostOrder(1);printf("\n"); //统计二叉树叶子节点的个数 int cntOfLeaves = 0;CountLeaves(1,cntOfLeaves);printf("该二叉树的叶子节点个数为:%d\n",cntOfLeaves);//求树的层数(最大深度)以及最深的节点 int MaxDeep = 0, MaxDeepLeafID = 0;getMaxDeep(1,1,MaxDeep,MaxDeepLeafID);printf("该二叉树的层数为:%d,最深的叶子节点的值为:%c\n",MaxDeep,PreOrder[MaxDeepLeafID]);} fclose(stdin);fclose(stdout);	return 0;	
} void dfs() //先序遍历中的序号 
{if(cnt==n) return;  //cnt = fa 表示上一个节点 int val = PreOrder[cnt]; //值 int p = pos[val];  //在中序遍历中的位置 int NextVal = PreOrder[cnt+1];int Nextp = pos[NextVal];if(Nextp<p) //cnt+1是cnt的左子节点 {Lchild[cnt] = cnt+1;fa[cnt+1] = cnt;}	else //Nextp > p   //可能该节点是某个节点的右子节点 {int father = -1;int x = cnt; //上一个节点while(true)  //先序遍历的第一个结点必定是树的根节点 {if(Rchild[x]==-1&&Nextp>pos[PreOrder[x]]){father = x;	} if(x==1) break;x = fa[x];	} Rchild[father] = cnt+1;fa[cnt+1] = father;}cnt++;if(cnt==n) return;dfs();
}void getPostOrder(int x)
{if(Lchild[x]!=-1) getPostOrder(Lchild[x]);if(Rchild[x]!=-1) getPostOrder(Rchild[x]);cout<<PreOrder[x];
}void CountLeaves(int x,int& num)
{if(Lchild[x]==-1&&Rchild[x]==-1) num++;if(Lchild[x]!=-1) CountLeaves(Lchild[x],num);if(Rchild[x]!=-1) CountLeaves(Rchild[x],num);
}
void getMaxDeep(int x,int deep,int &ans,int &LeafID)
{if(deep>ans){ans = deep;LeafID = x;}if(Lchild[x]!=-1) getMaxDeep(Lchild[x],deep+1,ans,LeafID);if(Rchild[x]!=-1) getMaxDeep(Rchild[x],deep+1,ans,LeafID); 
}


在这里插入图片描述

这篇关于《xzc最喜欢的二叉树》 部分数据标程 Apare_xzc的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/251376

相关文章

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核