1501 二叉树最大宽度和高度
题目链接:http://codevs.cn/problem/1501/
给出一个二叉树,输出它的最大宽度和高度。
第一行一个整数n。
下面n行每行有两个数,对于第i行的两个数,代表编号为i的节点所连接的两个左右儿子的编号。如果没有某个儿子为空,则为0。
输出共一行,输出二叉树的最大宽度和高度,用一个空格隔开。
5
2 3
4 5
0 0
0 0
0 0
2 3
n<16
默认第一个是根节点
以输入的次序为编号
2-N+1行指的是这个节点的左孩子和右孩子
注意:第二题有极端数据!
1
0 0
思路:
深度优先搜索二叉树,在搜索过程中每当进入第k层,则记录该层节点数的数组元素s[k]的值增加1.最后扫描数组s即可知道最大宽度。
在深度搜索时,每当搜索的深度k大于历史最大深度时则记录目前为止搜索到的最大深度。
1 #include<stdio.h> 2 #include<string.h> 3 int a[1000][2],s[1000]; //s[i]=x表示二叉树第i层有x个节点 4 int i,n,maxHight,maxWide; 5 void dfs(int i,int k) //i表示当前搜索的是第i个节点。k表示当前搜索到二叉树的第k层。 6 { 7 s[k]=s[k]+1;//s[k]表示二叉树中第k层的节点数目 8 if(k>maxHight) maxHight=k; 9 if(a[i][0]!=0) dfs(a[i][0],k+1); 10 if(a[i][1]!=0) dfs(a[i][1],k+1); 11 } 12 int main() 13 { 14 scanf("%d",&n); 15 memset(a,0,sizeof(a)); 16 memset(s,0,sizeof(s)); 17 for(i=1;i<=n;i++) 18 scanf("%d%d",&a[i][0],&a[i][1]); 19 maxHight=0; 20 dfs(1,1); 21 maxWide=0; 22 for(i=1;i<1000;i++) 23 if(s[i]>maxWide) maxWide=s[i]; 24 printf("%d %d",maxWide,maxHight); 25 return 0; 26 }
代码二:广搜
1 #include<iostream> 2 #include<queue> 3 #include<stdio.h> 4 using namespace std; 5 struct obj 6 { 7 int num,level;//某个节点的编号以及该节点所在的层级 8 }; 9 10 int n,a[100][2]={0};//节点数n,顺序存储的二叉树 11 queue<obj> q;//广搜的队列 12 int s[100]={0};//s[i]=x表示二叉树第i层有x个节点 13 int maxHight,maxWide;//最大深度、最大宽度 14 15 int main() 16 { 17 int i,x,y; 18 struct obj temp,temp2; 19 freopen("data.in","r",stdin); 20 scanf("%d",&n); 21 for(i=1;i<=n;i++) 22 { 23 scanf("%d%d",&x,&y); 24 a[i][0]=x;//节点i的左孩子 25 a[i][1]=y;//节点i的右孩子 26 } 27 28 temp.num=1; 29 temp.level=1; 30 q.push(temp); 31 s[1]=1; 32 maxHight=1; 33 while(!q.empty()) 34 { 35 temp=q.front(); q.pop(); 36 if(a[temp.num][0]!=0)//队头的左孩子节点入队 37 { 38 temp2.num=a[temp.num][0]; 39 temp2.level=temp.level+1; 40 q.push(temp2); 41 if(temp2.level>maxHight) maxHight=temp2.level; 42 s[temp2.level]++; 43 } 44 if(a[temp.num][1]!=0)//队头的右孩子节点入队 45 { 46 temp2.num=a[temp.num][1]; 47 temp2.level=temp.level+1; 48 q.push(temp2); 49 if(temp2.level>maxHight) maxHight=temp2.level; 50 s[temp2.level]++; 51 } 52 } 53 maxWide=-1; 54 for(i=1;i<=n;i++) 55 { 56 if(s[i]>maxWide) maxWide=s[i]; 57 } 58 printf("%d %d\n",maxWide,maxHight); 59 return 0; 60 }
黎芷淇的代码:
1 #include <iostream> 2 using namespace std; 3 typedef struct 4 { 5 int lc,rc;//该结点左右孩子结点的编号 6 int floor;//该结点所在层级 7 }node; 8 int main(int argc, char *argv[]) 9 { 10 int n,i,j,x,y; 11 int max=0,h=0,sum; 12 node tree[20]; 13 cin>>n; 14 tree[1].floor=1; 15 for(i=1;i<=n;i++) 16 { 17 cin>>x>>y; 18 tree[i].lc=x;tree[i].rc=y; 19 tree[x].floor=tree[i].floor+1;tree[y].floor=tree[i].floor+1; 20 } 21 for(i=1;i<=n;i++) 22 { 23 if(tree[i].floor>h)h=tree[i].floor; 24 } 25 for(i=1;i<=h;i++) 26 { 27 sum=0; 28 for(j=1;j<=n;j++) 29 { 30 if(tree[j].floor==i)sum++; 31 } 32 if(sum>max)max=sum; 33 } 34 cout<<max<<" "<<h; 35 return 0; 36 }
何泓历的代码:
1 #include <stdio.h> 2 int main() 3 { 4 int a[17][2]={0},n,i,b[17]={0},p1,p2,maxl=0,maxh=0; 5 //a[i][0]表示i节点的父亲,a[i][1]表示i节点的层,b[i]表示第i层节点数 6 //maxl表示最大宽度,maxh表示最大深度 7 scanf("%d",&n); 8 for(i=1;i<=n;i++) 9 { 10 scanf("%d%d",&p1,&p2); 11 a[p1][0]=a[p2][0]=i; 12 a[p1][1]=a[p2][1]=a[i][1]+1; 13 maxl=maxl<++b[a[i][1]]?b[a[i][1]]:maxl; 14 maxh=maxh<a[i][1]?a[i][1]:maxh; 15 } 16 printf("%d %d\n",maxl,maxh+1); 17 return 0; 18 }
1501 二叉树最大宽度和高度相关推荐
- 2018.3.26 1501 二叉树最大宽度和高度
题目描述 给出一个二叉树,输出它的最大宽度和高度. 输入描述 第一行一个整数n.下面n行每行有两个数,对于第i行的两个数,代表编号为i的节点所连接的两个左右儿子的编号.如果没有某个儿子为空,则为0. ...
- 二叉树 Java 实现 前序遍历 中序遍历 后序遍历 层级遍历 获取叶节点 宽度 ,高度,队列实现二叉树遍历 求二叉树的最大距离...
数据结构中一直对二叉树不是很了解,今天趁着这个时间整理一下 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显 ...
- c语言返回二叉树的大小,C语言中计算二叉树的宽度的两种方式
C语言中计算二叉树的宽度的两种方式 二叉树作为一种很特殊的数据结构,功能上有很大的作用!今天就来看看怎么计算一个二叉树的最大的宽度吧. 采用递归方式 下面是代码内容: int GetMaxWidth( ...
- html盒子宽高,css盒子模型之宽度和高度
盒子模型的宽度width高度height;宽度和高度的单位px像素,使用%动态计算(自适应和响应式) HTML代码 *lt;div class="pag1">*lt;/div ...
- 获取当前页面的宽度和高度
jQuery:获取当前打开页面的宽度和高度: var windowheight = $(window).height() - 20; var windowwidth = $(window).width ...
- java读取服务器图片大小,SpringMVC中MultipartFile上传获取图片的宽度和高度详解
SpringMVC一般使用MultipartFile来做文件的上传,通过MultipartFile的getContentType()方法判定文件的类型(MIME) ".doc":& ...
- CSS------当内容超出div宽度后自动换行和限制文字不超出div宽度和高度
原文:CSS------当内容超出div宽度后自动换行和限制文字不超出div宽度和高度 如图: 1.自动换行 <div style="widht:100%;height:100%;wo ...
- php获取图高度,PHP imagesx()、imagesy() – 获取图像宽度与高度_程序员人生
PHP 获取图像宽度与高度 PHP 获取图像宽度函数:imagesx() imagesx() 函数用于获取图像的宽度,单位为像素,返回值为整型. 语法: int imagesx( resource i ...
- Android在OnCreate中获取控件的宽度和高度
在Android中,有时需要对控件进行测量,得到的控件宽度和高度可以用来做一些计算.在需要自适应屏幕的情况下,这种计算就显得特别重要.另一方便,由于需求的原因,希望一进入界面后,就能得到控件的宽度和高 ...
最新文章
- no no no.不要使用kill -9.
- 网络盒子android系统版本怎样刷机,咪咕盒子MG100强制刷机rom固件安卓系统包_刷机教程...
- SAP TABLECONTROL 搜索帮助相关设置
- ecshop百度编辑器远程下载无后缀的图片,并且加水印
- SAP Spartacus 在未登录状态下浏览器 local storage 里存储的数据
- php实现网站插件机制的方法
- Codeforces Beta Round #11 B. Jumping Jack 思维
- python django开发工具_Django+python 开发神器
- 4-2017-12-2-2约瑟夫环
- [BZOJ1007][HNOI2008]水平可见直线 计算几何
- 2012-8-1复选框全选
- android最贵的手机,2019翻盖手机排行榜_2019年最贵的手机有哪些?最贵手机排行榜...
- Linux 初始化 init 系统(一)
- SIMATIC HMI操作系统更新
- android 原笔迹,Android-原笔迹手写的探索与开发
- python将二维数组升为一维数组 或 二维降为一维
- sdf贴图方式之tri-planar贴法
- java获取发件人_Java实现伪造发件人发送邮件
- 为什么站点访问慢?请收好这份 Web 服务器性能提升的总结
- 关闭计算机界面,windows7 关机一直停留在“正在关机”界面的解决方法
热门文章
- 应用软件(E-MAIL-FTP-WEB)
- [转]总不能一辈子做助理
- C#6.0,C#7.0新特性
- 【刷算法】整数中1出现的次数(从1到n整数中1出现的次数)
- RHEL6.4更改为CentOS6.4的yum源
- 对HA的简单认识以及HA集群删除
- The resource identified by this request is only capable of generating responses with characteristics
- sql loader 导入数据时的问题
- Linux优化和目录结构
- 腾讯云微计算实践:从Serverless说起,谈谈边缘计算的未来