SCAU 18924 二叉树的宽度

@TO18924 二叉树的宽度C
思路:
在建立的二叉树中增加len来确定层数,定义num数组来存储对应层数结点数

注意事项:
结点数为1时宽度为1;
注意输入为
4
1 2
3 4
2 3
这种无序的情况
(creat函数中注释部分)

#include<iostream>
#include<string>
using namespace std;
int num[50]={0}, max1 = 0;
struct node
{
	int len;//确定层数
	int parent;
	int lch;
	int rch;

};
node tree[50]={0};
void creat(int f, int c)
{
	tree[c].parent = f;//确定好其父节点
	//若没有len()函数以下做法在下列情况不适用
	/*
	4
	1 2
	3 4 
	2 3
	*/
	//tree[c].len = tree[f].len+1;
	//int temp = tree[c].len;
	//if (temp > max1)max1 = temp;//更新当前最大层数
	//num[temp]++;//该层结点数增加
	//cout <<temp<<" " << num[temp] << endl;
	if (!tree[f].lch)tree[f].lch = c;
	else tree[f].rch = c;
}
void len(int f)//遍历确定层数,同时找出最大的结点数
{
	if (!tree[f].lch && !tree[f].rch)return;//为叶子时结束
	if (tree[f].lch)//左子树
	{
		int c = tree[f].lch;
		tree[c].len = tree[f].len + 1;//子节点层数为父节点层数加1
		int temp = tree[c].len;
		num[temp]++;
		if (max1 < num[temp])max1 = num[temp];
		len(c);
	}
	if (tree[f].rch)//右子树
	{
		int c = tree[f].rch;
		tree[c].len = tree[f].len + 1;//子节点层数为父节点层数加1
		int temp = tree[c].len;
		num[temp]++;
		if (max1 < num[temp])max1 = num[temp];
		len(c);
	}
}
int main()
{
	num[1] = 1;
	tree[1].len = 1;
	int n;
	cin >> n;
	if (n == 1) {//考虑n为1时
		cout << "1";return 0;
	}
	int m = n - 1;
	while (m--)
	{
		int f, c;
		cin >> f >> c;
		creat(f, c);
	}
	len(1);
	cout << max1;
	return 0;
}

新手小白,有问题欢迎大佬指正!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现平衡二叉树的各种算法(如AVL树、红黑树等)可以应用在SCAU(South China Agricultural University,华南农业大学)的数据结构与算法课程中。这些算法的目标是确保二叉树的左右子树高度差不超过1,从而使树的高度保持相对较小的水平,提高插入、删除和查找等操作的效率。 一种常见的平衡二叉树算法是AVL树。实现AVL树的关键是通过旋转操作来保持树的平衡。在SCAU,可以使用多种编程语言(如C++、Java等)实现AVL树算法。插入新节点时,首先按照二叉查找树的方式找到合适的插入位置,然后通过不同的旋转操作调整树的平衡。具体的实现包括左旋、右旋、左右旋和右左旋等操作。 另一种常见的平衡二叉树算法是红黑树。SCAU可以使用编程语言(如C++、Java等)实现红黑树算法。红黑树通过使用辅助信息(即节点的颜色)来维持树的平衡。红黑树的插入操作包括节点的颜色变换和旋转操作。具体实现包括左旋、右旋、颜色变换等操作。 无论是AVL树还是红黑树,它们的实现都需要处理平衡调整,在插入或删除节点时通过旋转和颜色变换等操作来保持树的平衡。实现这些算法需要对平衡树的定义和性质有深入的理解,并具备编程技巧和数据结构基础。SCAU的学生在学习数据结构与算法课程时,可以通过理论学习和实践编程来掌握实现平衡二叉树的各种算法。除了课程的学习,还可以通过参考相关的教材、博客、论文等来加深对平衡二叉树算法实现的理解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值