题目链接:http://codevs.cn/problem/1501/

题目描述 Description

给出一个二叉树,输出它的最大宽度和高度。

输入描述 Input Description

第一行一个整数n。

下面n行每行有两个数,对于第i行的两个数,代表编号为i的节点所连接的两个左右儿子的编号。如果没有某个儿子为空,则为0。

输出描述 Output Description

输出共一行,输出二叉树的最大宽度和高度,用一个空格隔开。

样例输入 Sample Input

5

2 3

4 5

0 0

0 0

0 0

样例输出 Sample Output

2 3

数据范围及提示 Data Size & Hint

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 二叉树最大宽度和高度相关推荐

  1. 2018.3.26 1501 二叉树最大宽度和高度

    题目描述 给出一个二叉树,输出它的最大宽度和高度. 输入描述 第一行一个整数n.下面n行每行有两个数,对于第i行的两个数,代表编号为i的节点所连接的两个左右儿子的编号.如果没有某个儿子为空,则为0. ...

  2. 二叉树 Java 实现 前序遍历 中序遍历 后序遍历 层级遍历 获取叶节点 宽度 ,高度,队列实现二叉树遍历 求二叉树的最大距离...

    数据结构中一直对二叉树不是很了解,今天趁着这个时间整理一下 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显 ...

  3. c语言返回二叉树的大小,C语言中计算二叉树的宽度的两种方式

    C语言中计算二叉树的宽度的两种方式 二叉树作为一种很特殊的数据结构,功能上有很大的作用!今天就来看看怎么计算一个二叉树的最大的宽度吧. 采用递归方式 下面是代码内容: int GetMaxWidth( ...

  4. html盒子宽高,css盒子模型之宽度和高度

    盒子模型的宽度width高度height;宽度和高度的单位px像素,使用%动态计算(自适应和响应式) HTML代码 *lt;div class="pag1">*lt;/div ...

  5. 获取当前页面的宽度和高度

    jQuery:获取当前打开页面的宽度和高度: var windowheight = $(window).height() - 20; var windowwidth = $(window).width ...

  6. java读取服务器图片大小,SpringMVC中MultipartFile上传获取图片的宽度和高度详解

    SpringMVC一般使用MultipartFile来做文件的上传,通过MultipartFile的getContentType()方法判定文件的类型(MIME) ".doc":& ...

  7. CSS------当内容超出div宽度后自动换行和限制文字不超出div宽度和高度

    原文:CSS------当内容超出div宽度后自动换行和限制文字不超出div宽度和高度 如图: 1.自动换行 <div style="widht:100%;height:100%;wo ...

  8. php获取图高度,PHP imagesx()、imagesy() – 获取图像宽度与高度_程序员人生

    PHP 获取图像宽度与高度 PHP 获取图像宽度函数:imagesx() imagesx() 函数用于获取图像的宽度,单位为像素,返回值为整型. 语法: int imagesx( resource i ...

  9. Android在OnCreate中获取控件的宽度和高度

    在Android中,有时需要对控件进行测量,得到的控件宽度和高度可以用来做一些计算.在需要自适应屏幕的情况下,这种计算就显得特别重要.另一方便,由于需求的原因,希望一进入界面后,就能得到控件的宽度和高 ...

最新文章

  1. no no no.不要使用kill -9.
  2. 网络盒子android系统版本怎样刷机,咪咕盒子MG100强制刷机rom固件安卓系统包_刷机教程...
  3. SAP TABLECONTROL 搜索帮助相关设置
  4. ecshop百度编辑器远程下载无后缀的图片,并且加水印
  5. SAP Spartacus 在未登录状态下浏览器 local storage 里存储的数据
  6. php实现网站插件机制的方法
  7. Codeforces Beta Round #11 B. Jumping Jack 思维
  8. python django开发工具_Django+python 开发神器
  9. 4-2017-12-2-2约瑟夫环
  10. [BZOJ1007][HNOI2008]水平可见直线 计算几何
  11. 2012-8-1复选框全选
  12. android最贵的手机,2019翻盖手机排行榜_2019年最贵的手机有哪些?最贵手机排行榜...
  13. Linux 初始化 init 系统(一)
  14. SIMATIC HMI操作系统更新
  15. android 原笔迹,Android-原笔迹手写的探索与开发
  16. python将二维数组升为一维数组 或 二维降为一维
  17. sdf贴图方式之tri-planar贴法
  18. java获取发件人_Java实现伪造发件人发送邮件
  19. 为什么站点访问慢?请收好这份 Web 服务器性能提升的总结
  20. 关闭计算机界面,windows7 关机一直停留在“正在关机”界面的解决方法

热门文章

  1. 应用软件(E-MAIL-FTP-WEB)
  2. [转]总不能一辈子做助理
  3. C#6.0,C#7.0新特性
  4. 【刷算法】整数中1出现的次数(从1到n整数中1出现的次数)
  5. RHEL6.4更改为CentOS6.4的yum源
  6. 对HA的简单认识以及HA集群删除
  7. The resource identified by this request is only capable of generating responses with characteristics
  8. sql loader 导入数据时的问题
  9. Linux优化和目录结构
  10. 腾讯云微计算实践:从Serverless说起,谈谈边缘计算的未来