1501 二叉树最大宽度和高度

简介: 题目链接:http://codevs.cn/problem/1501/题目描述 Description    给出一个二叉树,输出它的最大宽度和高度。输入描述 Input Description第一行一个整数n。

题目链接: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 }

 

相关文章
|
1月前
|
前端开发
元素的宽度和高度
元素的宽度和高度。
23 4
|
1月前
|
前端开发
|
1月前
在使用 Flexbox 布局实现自适应宽度的品字布局时,子元素的排列顺序是否可以调整?
【10月更文挑战第27天】使用Flexbox布局实现自适应宽度的品字布局时,可以通过调整HTML结构中的顺序或使用 `order` 属性来灵活地调整子元素的排列顺序,以满足不同的设计和布局需求。
|
7月前
表格宽度和高度
表格宽度和高度。
45 1
|
人工智能 BI
LeetCode-310 最小高度树
LeetCode-310 最小高度树
二叉树最大宽度
二叉树最大宽度
65 0
|
Java
求一颗二叉树的宽度
求一颗二叉树的宽度
100 0
求一颗二叉树的宽度
|
机器学习/深度学习 人工智能 BI
310. 最小高度树 : 树形 DP 模板题
310. 最小高度树 : 树形 DP 模板题