题目
Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as:
a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
Example 1:
Given the following tree [3,9,20,null,null,15,7]:
3
/ \
9 20
/ \
15 7
Return true.
Example 2:
Given the following tree [1,2,2,3,3,null,null,4,4]:
1
/ \
2 2
/ \
3 3
/ \
4 4
Return false.
总结
这题很意外,我绞尽脑汁觉得自己可能写错,居然一次通过并且接近最优解
先上我的代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isBalanced(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
result = self.helper(root)
return result != -1
def helper(self, node):
if not node:
return 0
left = self.helper(node.left)
right = self.helper(node.right)
if left == -1 or right == -1:
return -1
gap = abs(left - right)
if gap > 1:
return -1
else:
return max(left, right) + 1
分析:
这题最先想到的是肯定需要遍历每一个节点,判断每个节点是否为BST,刚开始想用一个method递归写出来,但是思考了一会发现必须知道每个点的深度信息才能判断每个点是否为BST,那么就必须有一个递归方法用来求深度。考虑在求深度的同时得到是否为BST的信息。
问题:
1. 自己为求深度这块不熟,没有很快想到使用max(left, right) + 1
递归的形式,导致花了不少时间思考思路
2. 对返回-1这种形式没底气,总觉得自己这样写不太elegance,然而看别人基本都是这样写的。所以能解决问题也应适当不考虑代码的‘美观‘
3.每次得到left就先判断是否为-1,可以减少运行时间
改进后的代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isBalanced(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
result = self.helper(root)
return result != -1
def helper(self, node):
if not node:
return 0
left = self.helper(node.left)
if left == -1:
return -1
right = self.helper(node.right)
if right == -1:
return -1
if abs(left - right) > 1:
return -1
else:
return max(left, right) + 1