CODE[VS]1501 二叉树最大宽度和高度

本文介绍如何通过给定的二叉树节点连接信息,计算其最大宽度和高度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1501 二叉树最大宽度和高度
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 白银 Silver
题解
题目描述 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

这题你们别想投机取巧了,给我老老实实搜索!


#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int MaxHeight = 0;
int Height = 0;
int treeNode[16][2] = { 0 };
int num[16] = { 0 };

struct Node//树节点
{
	int data;
	int height;
	Node* left;
	Node* right;
};

typedef struct Node* Tree;

Tree Build(int x, Tree &t)//根据数组建树
{

	if (x == 0)
	{
		t = NULL;
	}
	else
	{
		Height++;
		if (Height > MaxHeight)
			MaxHeight = Height;
		t = (Tree)malloc(sizeof(Node));
		t->data = x;
		t->height = Height;
		Build(treeNode[x][0], t->left);
		Build(treeNode[x][1], t->right);
		Height--;
	}
	return t;
}

void view(Tree &t)
{
	if (t == NULL)
		return;
	else
	{
		view(t->left);
		num[t->height]++;
		view(t->right);
	}
}

int main()
{
	int n;
	while (scanf("%d", &n) != EOF)
	{
		memset(num, 0, sizeof(int) * 16);
		MaxHeight = 0;
		Height = 0;
		int findRoot[16] = { 0 };
		int i,maxNum=0;
		for (i = 1; i <= n; ++i)
		{
			scanf("%d%d", &treeNode[i][0], &treeNode[i][1]);
			findRoot[treeNode[i][0]] = 1;
			findRoot[treeNode[i][1]] = 1;
		}
		for (i = 1; i <= n; i++)
		{
			if (findRoot[i] == 0)
				break;
		}
		Tree t;
		t = Build(i, t);
		view(t);
		for (i = 1; i <= n; i++)
		{
			if (num[i] > maxNum)
				maxNum = num[i];
		}
		printf("%d %d\n", maxNum, MaxHeight);
	}
}


### 哈夫曼树用于图片压缩的算法实现与原理 #### 理论基础 哈夫曼编码是一种基于字符频率的概率编码方法,能够有效减少数据冗余并提高存储效率。对于图像文件而言,通过分析像素值分布情况来构建最优前缀码表,从而达到无损压缩的目的。 #### 构建哈夫曼树 为了创建适用于特定图像的哈夫曼树,需先统计该图像中各灰度级(或颜色索引)出现次数作为节点权重,并按照以下原则建立二叉树结构: - 将所有可能取值初始化为叶子结点; - 反复选取两个具有最小权重值的未连接节点组合成新的父节点直到只剩下一个根节点为止; 此过程可以利用优先队列高效完成[^1]。 #### 编码映射生成 一旦获得了完整的哈夫曼树之后,就可以自底向上遍历整棵树以确定每种符号对应的唯一路径表示形式——即所谓的“霍夫曼编码”。较常使用的数值会被分配更短的位串,而较少见的情况则采用较长序列描述。 #### 数据流转换 实际应用时还需考虑原始图像尺寸信息保存等问题,在这里可以通过固定长度字段记录宽度高度参数以便后续解码操作识别边界条件。接着逐个读入源文件中的每一个字节,依据预先准备好的对照关系将其替换为目标格式下的紧凑表达方式写入目标位置。 #### 文件大小估算函数解析 给定代码片段展示了两种不同场景下估计最终输出体积的方法: - `FindNSize` 函数负责计算经过哈夫曼编码处理后的预期占用空间量,考虑到计算机内部是以字节(byte)而非比特(bit)计量单位传递资料的事实,因此当累积总不是8的倍数时要额外增加一字节补偿不足部分。 - `FindSIZE` 则单纯累加各个独立项所占有的理论容量,这有助于评估未经任何优化措施之前的基线水平。 ```cpp // 计算新文件字节数 int FindNSize(HuffmanCode& HC, HuffmanTree HT) { int sum = 0; for (int i = 0; i < 256; ++i){ sum += strlen(HC[i + 1]) * HT[i + 1].weight; } if (sum % 8 == 0) return sum / 8; else return sum / 8 + 1; } // 计算原文件按哈夫曼编码定义的大小 int FindSIZE(HuffmanCode& HC, HuffmanTree HT) { int sum = 0; for (int i = 0; i < 256; ++i){ sum += strlen(HC[i + 1]) * HT[i + 1].weight; } return sum; } ``` 上述两段 C++ 函数分别实现了对压缩前后文件大小的预测功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值