1. 程式人生 > 實用技巧 >leetcode刷題筆記一百一十題 平衡二叉樹

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
    }
}