18924 二叉树的宽度 SCAU 数据结构 数组存储

/*18924 二叉树的宽度
时间限制:1000MS  代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题   语言: 不限定
Description
二叉树的宽度指的是具有节点数目最多的那一层的节点个数。
		  1
		 / \
		2   3
	   /
	  4
答案为2, 第二层节点数最多,为2个节点。

输入格式
共n行。
第一行一个整数n,表示有n个结点,编号为1至n。(1<=n<=50)
第二行至第n行,每行有两个整数x和y,表示在二叉树中x为y的父节点。

输出格式
输出二叉树的直径。

输入样例
5
1 2
1 3
2 4
2 5

输出样例
2

https://blog.csdn.net/u013243986/article/details/51859181?utm_medium=distribute.wap_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-7.wap_blog_relevant_pic&dist_request_id=&depth_1-utm_source=distribute.wap_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-7.wap_blog_relevant_pic
里面有一张图可以辅助理解
*/
#include<stdio.h>
#include<math.h>
int tree[100] = { 0 };  //用来存储树的节点数据
int treeNum[100] = { 0 };//出来存储树的节点是放在哪个序号
void  f(int p, int c)
{
	if (tree[2 * treeNum[p]] == 0) {
		tree[2 * treeNum[p]] = c;//放数据
		treeNum[c] = 2 * treeNum[p];//放数据的在树里面的序号
	}//左子树没有被占用放左子树
	else {
		tree[2 * treeNum[p] + 1] = c;
		treeNum[c] = 2 * treeNum[p] + 1;
	}//放在右子树
}
int main()
{
	int n;
	scanf("%d", &n);
	if (n == 1) {
		printf("1");
		return 0;
	}//只有一个节点
	int p, c;
	scanf("%d %d", &p, &c);
	tree[1] = p;
	treeNum[p] = 1;
	tree[2] = c;
	treeNum[c] = 2;
	for (int i = 1; i < n - 1; i++)
	{
		scanf("%d %d", &p, &c);
		f(p, c);
	}//录入节点情况
	int level = log(n) / log(2) + 1; //树的层数 log n
	int num = 0;
	int max = 0;
	int lLast = 0; //每一层最后的序号
	for (int i = 1; i <= level; i++)
	{
		num = 0;
		lLast = 2 * pow(2, i - 1) - 1;//每一层最后的序号
		for (int j = pow(2, i - 1); j <= lLast; j++) //j是每一层的起点
		{
			if (tree[j] != 0) //统计每一层非空节点
				num++;
		}
		if (max < num)
			max = num;
	}
	printf("%d", max);
}

 

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值