18924 二叉树的宽度
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC
Description
二叉树的宽度指的是具有节点数目最多的那一层的节点个数。
1
/
2 3
/
4
答案为2, 第二层节点数最多,为2个节点。
输入格式
共n行。
第一行一个整数n,表示有n个结点,编号为1至n,结点1为树根。(1<=n<=50)
第二行至第n行,每行有两个整数x和y,表示在二叉树中x为y的父节点。x第一次出现时y为左孩子
输出格式
输出二叉树的宽度。
输入样例
5
1 2
1 3
2 4
2 5
输出样例
2
作者 30002692
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
typedef struct tree {
//这里用0表示空
int lc=0, rc=0;
}tree;
int main(void) {
tree T[55];
//树节点数组
int n;
cin >> n;
//输入
for (int i = 0; i < n-1; i++) {
int x, y;
cin >> x >> y;
//左孩子不为空就输入输入右孩子
if (!T[x].lc)T[x].lc = y; else T[x].rc = y;
}
//当前宽度,最大宽度
int curwide=1,maxwide = 1;
//手写一个模拟队列
int a[100000];
//前后指针
int front = 0, rear = 0;
//讲道理第一个节点可能不是1,严谨的做法应该是遍历节点找到第一个没有祖先,有左孩子或右孩子的节点,该节点为根节点
//这道题第根节点是1所以入队根节点1
a[rear++] = 1;
//队列为空的条件就是前指针=后指针
while (rear != front) {
//当前队列长度即为宽度
curwide = rear - front;
//如果大于就更换max
if (maxwide < curwide)maxwide = curwide;
//循环队列长度curwide次,遍历当前层所有节点
for (int i = 0; i < curwide; i++) {
//左孩子不为空则入队左孩子
if (T[a[front]].lc != 0) {
a[rear++] = T[a[front]].lc;
}
//右孩子不为空则入队右孩子
if (T[a[front]].rc != 0) {
a[rear++] = T[a[front]].rc;
}
//查完一个节点后前指针向后移一位
front++;
}
}
//输出最大
cout << maxwide << endl;
return 0;
}
本文介绍如何利用广度优先搜索算法来计算二叉树的最大宽度,即树中节点最多的那一层的节点数,通过示例和代码实现展示了如何解决这个问题。

1373

被折叠的 条评论
为什么被折叠?



