leetcode刷题笔记一百一十题 平衡二叉树

leetcode刷题笔记一百一十题 平衡二叉树

源地址:110. 平衡二叉树

问题描述:

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

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

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过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 。

/**
本题可分为自顶向下或自底向上两种思路
自顶向下的方法需要使用辅助函数计算当前结点的左右子树的高度,然后判断高度差是否小于2
*/
/**
 * Definition for a binary tree node.
 * class TreeNode(var _value: Int) {
 *   var value: Int = _value
 *   var left: TreeNode = null
 *   var right: TreeNode = null
 * }
 */
object Solution {
    def isBalanced(root: TreeNode): Boolean = {
        def helper(root: TreeNode): Int = {
            if (root == null) return 0
            else return 1 + Math.max(helper(root.left), helper(root.right))
        }
        if (root == null) return true
        if (Math.abs(helper(root.left) - helper(root.right)) < 2) return isBalanced(root.left) && isBalanced(root.right)
        return false
    }
}

/**
由于自顶向下的方法含有子树高度的重复计算,使用自底向上能够有效的标记不符合平衡的子树为-1,整个向上过程中,如果出现-1直接返回
*/
bject Solution {
    def isBalanced(root: TreeNode): Boolean = {
        def helper(root: TreeNode): Int = {
            if (root == null) return 0
            val leftTree = helper(root.left)
            if (leftTree == -1) return -1
            val rightTree = helper(root.right)
            if (rightTree == -1) return -1
            if (Math.abs(leftTree - rightTree) < 2) return Math.max(leftTree, rightTree)+1
            else return -1
        }
        if (root == null) return true
        return helper(root) != -1
    }
}
posted @ 2020-08-06 16:07  ganshuoos  阅读(148)  评论(0编辑  收藏  举报