LeetCode 分类刷题:110. 平衡二叉树

题目

给定一个二叉树,判断它是否是 平衡二叉树

解析

// 怎么递归?

// 左右子树的高度相差不超过1

// 递归计算左、右子树的高度,如果高度相差超过1,返回-1;否则正常返回树的高度

// 递归终止条件:节点为空 或 已经检测出某棵子树不平衡

答疑

问:代码中的 −1 是怎么产生的?怎么返回的?

答:在某次递归中,发现左右子树高度绝对差大于 1,我们会返回 −1这个 −1 会一路向上不断返回,直到根节点。

作者:灵茶山艾府

链接:https://leetcode.cn/problems/balanced-binary-tree/solutions/2015068/ru-he-ling-huo-yun-yong-di-gui-lai-kan-s-c3wj/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

答案

这里一开始没写对,因为leftH 和 rightH没有声明类型!!!不止犯一次的错误了!!!

为什么必须加 let / const

  • 在 JavaScript 中,未声明的变量会成为全局变量(即使在函数内部)。
  • 递归时,leftHrightH 会被错误地覆盖(例如:第一次递归的 leftH 会污染后续递归的 leftH),导致高度计算错误。
javascript 复制代码
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isBalanced = function(root) {
    function f(node) {
        if(node === null) return 0;
        const leftH = f(node.left);
        if(leftH === -1) return -1;
        const rightH = f(node.right);
        if(rightH === -1 || Math.abs(leftH - rightH) > 1) return -1;
        return Math.max(leftH, rightH) + 1;
    }
    return f(root) !== -1;
};

复杂度分析

时间复杂度:O(n),其中 n 为二叉树的节点个数。

空间复杂度:O(n)。最坏情况下,二叉树退化成一条链,递归需要 O(n) 的栈空间。

相关推荐
2501_9209317033 分钟前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
-dzk-2 小时前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
风筝在晴天搁浅2 小时前
hot100 78.子集
java·算法
Jasmine_llq2 小时前
《P4587 [FJOI2016] 神秘数》
算法·倍增思想·稀疏表(st 表)·前缀和数组(解决静态区间和查询·st表核心实现高效预处理和查询·预处理优化(提前计算所需信息·快速io提升大规模数据读写效率
超级大只老咪3 小时前
快速进制转换
笔记·算法
东东5163 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino3 小时前
图片、文件的预览
前端·javascript
m0_706653233 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你913 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
qq_423233903 小时前
C++与Python混合编程实战
开发语言·c++·算法