每日一题-判断是否是平衡二叉树

判断是否是平衡二叉树

)

题目描述

输入一棵节点数为 n 的二叉树,判断该二叉树是否是平衡二叉树。平衡二叉树定义为:

  1. 它是一棵空树。
  2. 或者它的左右子树的高度差的绝对值不超过1,并且左右子树本身也是平衡二叉树。

平衡二叉树的性质:

  • 空树被认为是平衡二叉树。
  • 每个节点的左右子树高度差不超过1。

数据范围

  • n ≤ 100
  • 每个节点的值 val 满足 0 ≤ val ≤ 1000

题解

解题思路

我们可以通过深度优先搜索(DFS)来判断一棵二叉树是否是平衡二叉树。具体步骤如下:

  1. 定义树的高度: 计算任意一个节点的左子树和右子树的高度。
  2. 平衡性判断: 如果某个节点的左右子树的高度差超过1,树就不平衡;否则继续判断该节点的左右子树。
  3. 递归遍历: 对树的每个节点递归地进行平衡性判断。

递归算法

我们可以通过递归来判断二叉树的平衡性,同时在递归过程中计算树的高度。递归的核心思想是:

  • 如果左右子树的高度差超过1,返回 false
  • 否则继续判断左右子树的平衡性。

为了避免重复计算,我们可以在递归时直接返回每个子树的高度。

代码实现

c 复制代码
#include <stdbool.h>

// 定义二叉树节点结构体
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};

// 计算树的高度
int height(struct TreeNode* pRoot) {
    if (pRoot == NULL)
        return 0;  // 空树高度为0
    
    int left = height(pRoot->left);  // 左子树的高度
    int right = height(pRoot->right);  // 右子树的高度
    
    if (left == -1 || right == -1 || abs(left - right) > 1) {
        return -1;  // 如果左右子树高度差超过1,返回-1,表示不平衡
    }
    
    return 1 + (left > right ? left : right);  // 返回树的高度
}

// 判断是否为平衡二叉树
bool IsBalanced_Solution(struct TreeNode* pRoot) {
    return height(pRoot) != -1;  // 如果高度返回-1,表示不平衡
}

代码解析

  1. height 函数: 计算二叉树的高度,同时判断树是否平衡。

    • 如果当前节点为空,返回高度 0
    • 递归计算左子树和右子树的高度。
    • 如果某个子树的高度差超过1,或者某个子树本身不平衡(返回 -1),就返回 -1 表示树不平衡。
    • 否则,返回当前树的高度。
  2. IsBalanced_Solution 函数: 通过调用 height 函数来判断整棵树是否平衡。如果 height 返回 -1,则说明树不平衡,返回 false;否则返回 true

时间和空间复杂度分析

  • 时间复杂度: O(n)。每个节点只会被访问一次,时间复杂度为 O(n),其中 n 是树的节点数。
  • 空间复杂度: O(h)。递归调用栈的深度是树的高度 h,最坏情况下(例如完全不平衡的树),空间复杂度为 O(n)

示例

示例 1

输入:

复制代码
{1,2,3,4,5,6,7}

输出:

复制代码
true
示例 2

输入:

复制代码
{}

输出:

复制代码
true

总结

本题通过递归遍历二叉树,计算每个节点的左右子树高度,同时判断左右子树的高度差是否超过1来判断树是否平衡。时间复杂度为 O(n),空间复杂度为 O(h),其中 n 是节点数,h 是树的高度。非常难得是居然一次编译直接成功了,太开心了。题刷百编,其意自现。

相关推荐
2501_9416233214 小时前
智慧农业监控平台中的多语言语法引擎与实时决策实践
leetcode
轻抚酸~15 小时前
KNN(K近邻算法)-python实现
python·算法·近邻算法
Yue丶越17 小时前
【C语言】字符函数和字符串函数
c语言·开发语言·算法
小白程序员成长日记18 小时前
2025.11.24 力扣每日一题
算法·leetcode·职场和发展
有一个好名字18 小时前
LeetCode跳跃游戏:思路与题解全解析
算法·leetcode·游戏
AndrewHZ19 小时前
【图像处理基石】如何在图像中提取出基本形状,比如圆形,椭圆,方形等等?
图像处理·python·算法·计算机视觉·cv·形状提取
蓝牙先生19 小时前
简易TCP C/S通信
c语言·tcp/ip·算法
2501_9418705619 小时前
Python在高并发微服务数据同步与分布式事务处理中的实践与优化
leetcode
xiaoye-duck21 小时前
计数排序:高效非比较排序解析
数据结构
2501_9411477121 小时前
高并发微服务架构Spring Cloud与Dubbo在互联网优化实践经验分享
leetcode