110. 平衡二叉树

题目

给定一个二叉树,判断它是否是 平衡二叉树
平衡二叉树 是指该树所有节点的左右子树的高度相差不超过 1。

解题思路

平衡二叉树要满足局部平衡全局平衡,所谓局部平衡就是树的所有子树都要是平衡的。

  • 左右子树的高度差不超过1
  • 左子树是平衡二叉树
  • 右子树是平衡二叉树

可以遍历节点,判断每个节点是不是平衡二叉树,若不是直接返回 false 。遍历完整个树都是平衡二叉树才返回 true

采用递归方法,自底向上判断。

  1. 后序遍历二叉树(左-右-根)
  2. 对于每个节点,先判断其左右子树是否平衡,再判断以该节点为根的子树是否平衡
  3. 如果在任何一点发现不平衡,立即返回一个特殊值(如-1)表示不平衡
  4. 如果子树平衡,则返回其高度

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

// 辅助函数:计算树高度,同时判断是否平衡
// 如果树不平衡,返回-1;否则返回树的高度
int height(struct TreeNode* root) {
    // 空节点高度为0
    if (root == NULL) return 0;
    
    // 计算左子树高度,如果左子树不平衡,直接返回-1
    int leftHeight = height(root->left);
    if (leftHeight == -1) return -1;
    
    // 计算右子树高度,如果右子树不平衡,直接返回-1
    int rightHeight = height(root->right);
    if (rightHeight == -1) return -1;
    
    // 检查当前节点是否平衡
    if (abs(leftHeight - rightHeight) > 1) return -1;
    
    // 返回当前节点为根的子树高度
    return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}

bool isBalanced(struct TreeNode* root) {
    return height(root) != -1;
}

改进代码

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值