洛谷——【数据结构1-2】二叉树

文章目录

  • 题目
  • 【深基16.例1】淘汰赛
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
      • 基本思路:
      • 代码
  • 【深基16.例3】二叉树深度
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
      • 基本思路:
      • 代码
  • [USACO3.4] 美国血统 American Heritage
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
      • 基本思路:


题目

【深基16.例1】淘汰赛

题目描述

2 n 2^n 2n n ≤ 7 n\le7 n7)个国家参加世界杯决赛圈且进入淘汰赛环节。已经知道各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1 号国家和 2 号国家踢一场比赛,胜者晋级。3 号国家和 4 号国家也踢一场,胜者晋级……晋级后的国家用相同的方法继续完成赛程,直到决出冠军。给出各个国家的能力值,请问亚军是哪个国家?

输入格式

第一行一个整数 n n n,表示一共 2 n 2^n 2n 个国家参赛。

第二行 2 n 2^n 2n 个整数,第 i i i 个整数表示编号为 i i i 的国家的能力值( 1 ≤ i ≤ 2 n 1\leq i \leq 2^n 1i2n)。

数据保证不存在平局。

输出格式

仅一个整数,表示亚军国家的编号。

样例 #1

样例输入 #1

3
4 2 3 1 10 5 9 7

样例输出 #1

1

基本思路:

  • 这道题数据量比较小(n>=7),我是暴力模拟过的,从第n层开始选拔,每次选拔人数会减少一半,到第一层即v[0],只剩下1人,这个人就是冠军,第二层较小的即为亚军。

代码

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define gcd __gcd
#define repn(i,a,n) for(int i = a; i <= n; i++)
#define rep(i,a,n) for(int i = a; i < n; i++)
typedef pair<int,int> PII; 
int n;
vector<pair<int,int>> v[10];//分别保存能力值和编号void solve(){cin>>n;int len=pow(2,n);for(int i=1;i<=len;i++){int x;  cin>>x;v[n].push_back({x,i});//第n层一共n人}for(int i=n;i>0;i--){int len=pow(2,i);for(int j=0;j<len;j+=2){//两两比较找到胜者,晋级到上一层if(v[i][j].fi>v[i][j+1].fi)v[i-1].push_back({v[i][j].fi,v[i][j].se});elsev[i-1].push_back({v[i][j+1].fi,v[i][j+1].se});}}/*for(int i=n;i>0;i--){int len=pow(2,n);for(int j=0;j<v[i].size();j++){cout<<v[i][j].fi<<' ';}cout<<endl;}*/if(v[1][0].fi>v[1][1].fi)//这层存的是冠军和亚军,找到较小者为亚军cout<<v[1][1].se<<endl;elsecout<<v[1][0].se<<endl;
}signed main(){IOS;int T=1;while(T--){solve();}return 0;
}

【深基16.例3】二叉树深度

题目描述

有一个 n ( n ≤ 1 0 6 ) n(n \le 10^6) n(n106) 个结点的二叉树。给出每个结点的两个子结点编号(均不超过 n n n),建立一棵二叉树(根节点的编号为 1 1 1),如果是叶子结点,则输入 0 0

建好这棵二叉树之后,请求出它的深度。二叉树的深度是指从根节点到叶子结点时,最多经过了几层。

输入格式

第一行一个整数 n n n,表示结点数。

之后 n n n 行,第 i i i 行两个整数 l l l r r r,分别表示结点 i i i 的左右子结点编号。若 l = 0 l=0 l=0 则表示无左子结点, r = 0 r=0 r=0 同理。

输出格式

一个整数,表示最大结点深度。

样例 #1

样例输入 #1

7
2 7
3 6
4 5
0 0
0 0
0 0
0 0

样例输出 #1

4

基本思路:

  • 一道求二叉树深度的题,可以用dfs或者bfs求每个节点的深度,详细请看代码。

代码

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define gcd __gcd
#define repn(i,a,n) for(int i = a; i <= n; i++)
#define rep(i,a,n) for(int i = a; i < n; i++)
typedef pair<int,int> PII; 
const int N = 1000010;
struct Node{int l,r;int depth; 
}tree[N];
int n,maxdepth;//dfs求深度
inline void dfs(int x){if(tree[x].l){tree[tree[x].l].depth=tree[x].depth+1;maxdepth=max(maxdepth,tree[tree[x].l].depth);dfs(tree[x].l);}if(tree[x].r){tree[tree[x].r].depth=tree[x].depth+1;maxdepth=max(maxdepth,tree[tree[x].r].depth);dfs(tree[x].r);}
}void solve(){cin>>n;for(int i=1;i<=n;i++){int x,y; cin>>x>>y;if(x)tree[i].l=x;if(y)tree[i].r=y;}//一 dfs求深度//tree[1].depth=1;//dfs(1);//二 或者bfs求深度queue<Node> q;tree[1].depth=1;q.push(tree[1]);while(!q.empty()){auto t=q.front();q.pop();if(t.l){//左子树存在tree[t.l].depth=t.depth+1;//左儿子的深度等于当前节点深度+1maxdepth=max(maxdepth,tree[t.l].depth);//找到深度的最大值q.push(tree[t.l]);} if(t.r){//右子树存在tree[t.r].depth=t.depth+1;maxdepth=max(maxdepth,tree[t.r].depth);q.push(tree[t.r]);}}
//	for(int i=1;i<=7;i++)
//	  cout<<tree[i].depth<<' ';cout<<maxdepth<<endl;
}signed main(){IOS;int T=1;while(T--){solve();}return 0;
}

[USACO3.4] 美国血统 American Heritage

题目描述

农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛 们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而 不是用图形的方法。

你的任务是在被给予奶牛家谱的“树中序遍历”和“树前序遍历”的符号后,创建奶牛家谱的“树的 后序遍历”的符号。每一头奶牛的姓名被译为一个唯一的字母。(你可能已经知道你可以在知道树的两 种遍历以后可以经常地重建这棵树。)显然,这里的树不会有多于 26 26 26 个的顶点。

这是在样例输入和样例输出中的树的图形表达方式:

         C/  \/  \B    G/ \  /A   D  H/ \E   F

附注:

  • 树的中序遍历是按照左子树,根,右子树的顺序访问节点;
  • 树的前序遍历是按照根,左子树,右子树的顺序访问节点;
  • 树的后序遍历是按照左子树,右子树,根的顺序访问节点。

输入格式

第一行一个字符串,表示该树的中序遍历。

第二行一个字符串,表示该树的前序遍历。

输出格式

单独的一行表示该树的后序遍历。

样例 #1

样例输入 #1

ABEDFCHG
CBADEFGH

样例输出 #1

AEFDBHGC

提示

题目翻译来自NOCOW。

USACO Training Section 3.4

基本思路:

  • 给出先序遍历和中序遍历求后序遍历:
  • (1)我们知道先序遍历最后一个节点为根节点,找到这个根节点在中序遍历中的位置i。
  • (2)i的左边即为该根节点的左子树,右边即为右子树。此时通过分析中序遍历找到左子树的大小,再次确定左子树中根节点的位置,右子树同理。
  • (3)继续重复步骤1、2,不断递归即可。

题目中要求后序遍历,在建树中输出即可求得。求后序遍历的话画图分析就清晰多了ヾ(≧▽≦*)o

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define gcd __gcd
#define repn(i,a,n) for(int i = a; i <= n; i++)
#define rep(i,a,n) for(int i = a; i < n; i++)
typedef pair<int,int> PII; 
const int N = 27;
string pre,mid;//存放前序遍历和中序遍历 
int n;//二叉树节点个数 void build_tree(int lp,int rp,int lm,int rm){//前序左边界右边界、中序左边界有边界 if(lp>rp) return;//越界了 char root=pre[lp];//找到根节点,前序:根左右 //需要找到根节点root在中序的位置 //通过根节点找到左子树和右子树int i=lm;//i即为分界线 while(mid[i]!=root&&i<=rm)i++;build_tree(lp+1,lp+(i-lm),lm,i-1); //左子树build_tree(lp+(i-lm)+1,rp,i+1,rm);//右子树..cout<<root;//左右根,此时不断输出即为后序遍历 
}void solve(){cin>>mid>>pre;//中序、前序 n=mid.size();//字符串长度 mid=" "+mid,pre=" "+pre; build_tree(1,n,1,n);//前序1-n,中序1-n 
}signed main(){IOS;int T=1;while(T--){solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算符优先语法分析设计原理与实现

前言&#xff1a; 作者的词法分析程序以及算符优先语法分析设计程序仓库链接 1、目标任务 **[实验项目] **以专题 1 词法分析程序的输出为语法分析的输入&#xff0c;实现算符优先分析算法&#xff0c;完成以下描述算术表达式的算符优先文法的算符优先分析过程。 G[E]:E→E…

Spark编程实验三:Spark SQL编程

目录 一、目的与要求 二、实验内容 三、实验步骤 1、Spark SQL基本操作 2、编程实现将RDD转换为DataFrame 3、编程实现利用DataFrame读写MySQL的数据 四、结果分析与实验体会 一、目的与要求 1、通过实验掌握Spark SQL的基本编程方法&#xff1b; 2、熟悉RDD到DataFram…

2024免费的数据恢复软件EasyRecovery14自己操作就能恢复的方法

而今天小编为大家还是带来了同系列软件easyrecovery14&#xff0c;这是easyrecovery数据恢复软件中的技术员版本&#xff0c;不仅包含家庭版和专业版的所有功能&#xff0c;而且还旨在简化技术人员的数据恢复过程。软件拥有强大的数据恢复功能&#xff0c;支持使用的恢复场景有…

KNN与KD树博客总结

目录 总结小结&#xff1a; 总结 原始篇&#xff1a;KNN算法及其优缺点算法思想改进篇&#xff1a;KD树&#xff08;KNN的plus版算法实现第一篇&#xff1a;平衡二叉树的构建&#xff08;递归算法实现第二篇&#xff1a;KD树的构建&#xff08;递归算法实现第三篇&#xff1a;…

CentOS 7 设置网络

CentOS 7 设置网络 正常情况 ①登陆进去之后使用下面的命令修改文件 echo ONBOOTyes >> /etc/sysconfig/network-scripts/ifcfg-ens33②如果是虚拟机重启后使用如下命令进行查看IP地址 ip addr注&#xff1a;到这里如果显示有两部分&#xff0c;则代表网络设置成功&a…

华为设备VRP系统管理

为了满足企业业务对网络的需求&#xff0c;网络设备中的系统文件需要不断进行升级。另外&#xff0c;网络设备中的配置文件也需要时常进行备份&#xff0c;以防设备故障或其他灾害给业务带来损害。在升级和备份系统文件或配置文件时&#xff0c;经常会使用FTP和TFTP来传输文件。…

服务器系统时间不同步如何处理

在分布式计算环境中&#xff0c;服务器系统时间的同步至关重要。然而&#xff0c;由于各种原因&#xff0c;服务器系统时间不同步的问题时有发生,这可能会导致严重的问题&#xff0c;如日志不准确、证书验证失败等。下面我们可以一起探讨下造成服务器系统时间不同的原因以及解决…

【Vue2+3入门到实战】(5)Vue基础之Computed计算属性 详细示例

目录 一、今日学习目标1.computed计算属性 二、computed计算属性1.概念2.语法3.注意4.案例5.代码准备 三、computed计算属性 VS methods方法1.computed计算属性2.methods计算属性3.计算属性的优势4.总结 四、计算属性的完整写法五、综合案例-成绩案例六、Computed计算属性总结 …

揭秘Pod状态与生命周期管理的秘密(中)

上一篇文章中主要介绍了Pod的基础概念与使用、删除。本文将带你一起学习Pod的几种容器(Init、Pause) 点击 这里 可以查看所有相关文章。 Init 容器 本文讲解 Init 容器的基本概念&#xff0c;这是一种专用的容器&#xff0c;在应用程序容器启动之前运行&#xff0c;用来包含…

住宅代理妙用:网络抓取的必备工具

什么是住宅代理&#xff1f; 要准确理解什么是住宅代理&#xff0c;首先需要了解什么是住宅IP。IP 地址是连接到网络时分配给单个设备的唯一标识符。这允许设备或端点直接相互通信&#xff0c;而无需跨线。 住宅IP是指分配给特定设备&#xff08;例如计算机、手机、平板电脑等…

新版IDEA中Git的使用(二)

说明&#xff1a;前面介绍了在新版IDEA中Git的基本操作&#xff0c;本文介绍关于分支合并、拉取等操作&#xff1b; 例如&#xff0c;现在有一个项目&#xff0c;分支如下&#xff1a; main&#xff1a;主分支&#xff1b; dev&#xff1a;开发分支&#xff1b; test&#x…

CNVD原创漏洞审核和处理流程

一、CNVD原创漏洞审核归档和发布主流程 &#xff08;一&#xff09;审核和归档流程 审核流程分为一级、二级、三级审核&#xff0c;其中一级审核主要对提交的漏洞信息完整性进行审核&#xff0c;漏洞符合可验证&#xff08;通用型漏洞有验证代码信息或多个互联网实例、事件型…

k8s的二进制部署1

k8s的二进制部署&#xff1a;源码包部署 k8smaster01&#xff1a;192.168.176.61 kube-apiserver kube-controller-manager kube-scheduler etcd k8smaster01&#xff1a;192.168.176.62 kube-apiserver kube-controller-manager kube-scheduler node节点01&#xff1a;192.…

promise的使用和实例方法

前言 异步,是任何编程都无法回避的话题。在promise出现之前,js中也有处理异步的方案,不过还没有专门的api能去处理链式的异步操作。所以,当大量的异步任务逐个执行,就变成了传说中的回调地狱。 function asyncFn(fn1, fn2, fn3) {setTimeout(() > {//处理第一个异步任务fn1…

element步骤条<el-steps>使用具名插槽自定义

element步骤条使用具名插槽自定义 步骤条使用具名插槽: <el-steps direction"vertical" :active"1"><el-step><template slot"description">//在此处可以写你的插槽内容</template>/el-step> </el-steps>步骤…

STM32 cubeMX 直流电机控制风扇转动

本文使用的是 HAL 库。 文章目录 前言一、直流电机介绍二、直流电机原理图三、直流电机控制方法四、STM32CubeMX 配置直流电机五、代码编写总结 前言 实验开发板&#xff1a;STM32F051K8。所需软件&#xff1a;keil5 &#xff0c; cubeMX 。实验目的&#xff1a;了解 直流电机…

远程宠物喂食系统:开启宠物护理新纪元

智能化远程宠物喂食系统正在革新宠物业&#xff0c;宠物用品店、宠物托管服务商&#xff0c;宠物健康检测机构、宠物社区运营方等相关企业可能将因此取得更高效的运营&#xff0c;更深入的客户关系。这个系统不仅增强了宠物行业的智能化元素&#xff0c;还通过其精确和有效的管…

软件测试自学还是报班好?

如果你学软件测试&#xff0c;是以就业为目的&#xff0c;而且是以高薪就业为目的&#xff0c;那我们就要去反推&#xff0c;为了这个目标&#xff0c;我们要去做什么事情。 为了“将高薪就业为目的&#xff0c;我们要做什么事情”阐述清楚&#xff0c;本文行文结构如下&#x…

并发代码中的错误处理挑战

克服并发编程中的复杂性 并发编程可能是增加软件系统效率和响应性的强大技术。它使多个工作负载能够同时运行&#xff0c;充分利用了现代多核CPU。然而&#xff0c;强大的能力伴随着巨大的责任&#xff0c;良好的错误管理是并发编程中的主要任务之一。 并发代码的复杂性 并发…

找不到UnityEngine.UI解决方案

重新安装Visual Studio 后&#xff0c;使用unity找不到UnityEngine.UI解决方案 关键是在unity里需要设置一下 这个路径 C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE