[路飞]_程序员必刷力扣题: 110. 平衡二叉树

920 阅读1分钟

110. 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

image.png

输入: root = [3,9,20,null,null,15,7]
输出: true

示例 2:

image.png

输入: root = [1,2,2,3,3,null,null,4,4]
输出: false

示例 3:

输入: root = []
输出: true

提示:

节点总数 <= 1000

从底向上递归

思路

跟据题意,任意一个节点的左右子树神帝相差不超过1,则为平衡二叉树

  • 首先处理边界条件,根节点为nul直接返回true

从根节点开始递归,在递归的过程中,分别求出其左右子树的深度,如果左右子树的深度并进行比较,如果大于1则返回-1(代表该节点不平衡)

需要一个求深度的函数getDepth:

  • 判断传入的节点如果为null则返回深度0
  • 获取左右子树的深度,进行比较,如果有一颗为不平衡或者相差超过1则返回-1,代表该节点不平衡
  • 如果是平衡的,则返回左右子树深度的最大值再+1,为当前节点的深度

最后可以递归出根节点的深度,如果深度大于0则返回true否则为false

var isBalanced = function(root) {
    if (!root) return true
    function getDepth(node){
        if(node===null){
            return 0 
        }
        var leftDepth = getDepth(node.left)
        var rightDepth = getDepth(node.right)
        if(leftDepth===-1||rightDepth===-1||Math.abs(leftDepth-rightDepth)>1) return -1
        return Math.max(leftDepth,rightDepth)+1
    }
    return getDepth(root)>0
};

从上向下递归

思路

跟据题意,任意一个节点的左右子树神帝相差不超过1,则为平衡二叉树

  • 首先处理边界条件,根节点为nul直接返回true

需要一个求深度的函数getDepth,这里我们同归递归来求得一棵树的深度

  • 判断传入的节点如果为null则返回深度0
  • 否则直接返回左右子树的最大深度并且+1

判断根节点是否为平衡:

  • 对比根节点的左右子树
  • 同时根节点的左右子树也需要是平衡的(这样就能递归的差距判断每一颗子树是否为平衡二叉树)

递归中有任何一颗不平衡则整个判断为false

var isBalanced = function(root) {
    if (!root) return true
    function getDepth(node){
        if(node===null){
            return 0 
        }
        return Math.max(getDepth(node.left), getDepth(node.right))+1
    }
    
    return Math.abs(getDepth(root.left)- getDepth(root.right))<=1&&isBalanced(root.left)&&isBalanced(root.right)
};