日拱算法之判断平衡二叉树

简介: 输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

image.png

接上一篇《AVL 树旋转及 JS 实现,平衡树支棱起来~》,来了个难的,再来个相对简单的,别一直搁那“旋转树”而打击了“种二叉树”的自信心~~


日拱算法!冲!


题目

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。


示例 1:
给定二叉树 [3,9,20,null,null,15,7]
    3
   / \
  9  20
    /  \
   15   7
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
       1
      / \
     2   2
    / \
   3   3
  / \
 4   4
返回 false 。


  • 限制:0 <= 树的结点个数 <= 10000


解题思路:


要验证一颗二叉树是否为平衡二叉树,只需要它的左子树是平衡二叉树,右子树是平衡二叉树,并且左右子树的深度差小于 2;


创建深度计算函数:


检测传入的树,如果为空,返回0,如果不为空,递归调用深度计算函数,分别计算左右子树的深度,将两个深度中的最大值 +1 作为结果返回;


创建平衡判断函数:


使用深度计算函数计算左右子树的深度,计算深度差,递归调用平衡;判断左右子树是否是平衡,如果深度差小于 2,且左右子树都平衡,返回 true,否则返回 false;


/**
 * 平衡判断函数
 */
var isBalanced = function(root) {
    if(!root){
        return true
    }
    // 计算左子树和右子树的深度差
        // 判断左右子树是否平衡
    return Math.abs(depth(root.left) - depth(root.right)) < 2 && isBalanced(root.left) && isBalanced(root.right)
};
/**
 * 深度计算函数
 */
var depth = function(root) {
    if(!root) {
        return 0
    }
    else {
                // 取左右子树中深度比较大的值作为返回结果 +1
        return Math.max(depth(root.left), depth(root.right)) + 1
    }
}


反过来思考:


上面存在大量的重复计算,还可以使用从下向上的方式:

创建计算深度函数用于深度遍历树:


对左子树和右子树分别递归调用深度函数,计算深度,检测左右子树深度计算的结果,如果左子树的计算结果为 -1,返回 -1,如果右子树的计算结果为 -1,返回 -1,如果左右子树的深度差大于 1,返回 -1,检测通过,执行后续操作;


取左右子树中深度值较大的一个 +1,返回计算结果,调用计算深度函数,计算树,判断计算结果是否为 -1,如果是则二叉树不平衡,如果不是则二叉树平衡;


var isBalanced = function(root) {
    if(!root){return true}
    return defs(root) !== -1
};
// 计算树的深度
var defs = function(node) {
    if(!node) {
        return 0
    }
    // 计算左子树深度
    const left = defs(node.left)
        // 计算右子树深度
    const right = defs(node.right)
    switch(true) {
        // 如果左子树为 -1 则返回 -1
        case left === -1:
            return -1
        // 如果右子树为 -1 则返回 -1
        case right === -1:
            return -1
        // 如果左右子树的深度差大于1 则返回 -1
        case Math.abs(left - right) > 1:
            return -1
        default:
            // 取左右子树中深度较大的值 + 1 返回
            return Math.max(left, right) + 1
    }
}


OK,以上便是本次分享~~

撰文不易,点赞鼓励👍👍👍

我是掘金安东尼,公众号同名,日拱一卒、日掘一金,再会~



相关文章
|
8月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
63 0
|
3月前
|
存储 算法 数据管理
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
这篇文章通过需求分析、代码实现和测试验证,详细介绍了二叉排序树的创建、遍历和删除操作,以及二叉平衡树(AVL)的自平衡特性和单旋转操作,旨在提高树结构在数据管理中的效率和性能。
64 0
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
|
6月前
|
存储 缓存 算法
时间&空间复杂度,Python 算法的双重考验!如何优雅地平衡两者,打造极致性能?
【7月更文挑战第23天】在Python算法设计中,时间与空间复杂度是关键考量,需精妙平衡以优化程序性能。时间复杂度反映算法随输入规模增长的执行时间趋势,空间复杂度关注额外存储需求。线性搜索O(n)时间,O(1)空间;二分搜索O(log n)时间,O(1)空间,提升效率;动态规划如斐波那契数列O(n)时间与空间,利用存储减小计算。实际应用需按场景需求调整,如实时数据偏重时间,资源受限环境优先考虑空间。平衡两者,理解算法本质,结合实践,创造高性能程序。
65 7
|
7月前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
7月前
|
算法
数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)
数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)
160 0
|
8月前
|
人工智能 算法
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
|
8月前
|
机器学习/深度学习 存储 算法
R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题
R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题
127 1
R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题
|
8月前
|
机器学习/深度学习 算法 定位技术
Python实现SMOGN算法解决不平衡数据的回归问题
Python实现SMOGN算法解决不平衡数据的回归问题
111 1
|
8月前
|
算法 前端开发
前端算法-平衡二叉树
前端算法-平衡二叉树
|
算法 测试技术 C#
C++单调向量算法应用:所有子数组中不平衡数字之和
C++单调向量算法应用:所有子数组中不平衡数字之和

热门文章

最新文章