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