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

题目描述

描述
给定一个二叉树,判断它是否是高度平衡的二叉树。
高度平衡二叉树:一个二叉树 每个节点 的左右两个子树的高度差的绝对值不超过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;
}

猜你喜欢

转载自blog.csdn.net/qq_48163964/article/details/130149878
今日推荐