【二叉树练习】 - 平衡二叉树

题目描述

描述
给定一个二叉树,判断它是否是高度平衡的二叉树。
高度平衡二叉树:一个二叉树 每个节点 的左右两个子树的高度差的绝对值不超过1


解题分析:

思路:分治算法
1、当前树的根节点,所在的树不满足平衡二叉树的条件,返回false,后续不要判断
2、当前树的根节点,所在的树满足平衡二叉树的条件,再检查左,右子树是否满足,(左右子树继续分解成以上两步)
继续分解成,判断当前树的根节点是否满足平衡二叉树的条件,再检查左,右子树是否满足


代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
struct TreeNode
{
	struct TreeNode* left;//节点的左子树
	struct TreeNode* right;//节点的右子树
	int data;//节点的值
};
int maxDepth(struct TreeNode* root)//注意:root表示节点指针,第一次调用指根节点
{
	if (root == NULL)
	{
		return 0;
	}
	int leftDepth = maxDepth(root->left);
	int rightDepth = maxDepth(root->right);
	return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}
bool isBalancedTree(struct TreeNode* root)//注意:root表示节点指针,第一次调用指根节点
{
	//空树满足
	if (root == NULL)
		return true;
	int leftDepth = maxDepth(root->left);//计算左子树深度
	int rightDepth = maxDepth(root->right);//计算右子树深度

	return abs(leftDepth - rightDepth) < 2 
		&& isBalancedTree(root->left) && isBalancedTree(root->right);//根(当前节点) 当前节点的左子树 当前节点的右子树

	//abs(leftDepth - rightDepth)是检查当前节点是否满足平衡二叉树的要求,
	//当满足继续递归左子树和右子树isBalancedTree(root->left) && isBalancedTree(root->right)...
	//直到所有的子树都检查了一遍满足要求。
}
//注意:画递归展开图进行理解。

int main()
{
	//测试功能
	struct TreeNode node1;
	struct TreeNode node2;
	struct TreeNode node3;
	node1.data = 1;
	node1.left = &node2;
	node1.right = &node3;

	node2.data = 2;
	node2.left = NULL;
	node2.right = NULL;

	node3.data = 3;
	node3.left = NULL;
	node3.right = NULL;

	if (isBalancedTree(&node1))
		printf("Yes");
	else
		printf("No");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\]和引用\[3\]的内容,构建一个平衡二叉树的过程包括以下几个步骤:输入结点、寻找结点插入位置、插入结点、判断树是否平衡、调整树的平衡。 首先,通过输入结点的值,从根结点开始逐一比较,如果大于根结点的值,则继续在根结点的右子树中递归寻找插入位置;如果小于根结点的值,则在根结点的左子树中递归寻找插入位置。当找到插入位置时,创建一个新的结点并将其插入。 接下来,利用递归的栈特点,从距离新插入结点最近的结点开始,从下往上进行平衡的检测。如果发现树的某个结点不平衡,即左右子树的高度差超过1,就进行旋转操作来调整树的平衡。 根据引用\[2\]的内容,旋转操作时需要重新申请一个类型为AVLTree的结点B,并将旋转结果复制到B中。这是为了避免在原有平衡树上进行修改,从而导致错误和重复的部分。 因此,练习4.2中平衡二叉树的根可以通过插入函数Insert来实现,具体代码可以参考引用\[3\]中的实现思路。在插入过程中,每次新申请的结点都需要插入,否则将不会有任何改变。 #### 引用[.reference_title] - *1* *2* *3* [PTA练习4.2 平衡二叉树的根 (25 分)](https://blog.csdn.net/Mai___/article/details/119139360)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值