跳到主要内容

110. 平衡二叉树 [easy]

110. 平衡二叉树 [easy]

https://leetcode-cn.com/problems/balanced-binary-tree/

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

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

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

通过次数90,601 | 提交次数172,697

First Try

2020-07-17

仍然是使用递归法,不停比较左右子树的高度,如果出现超标的情况,通过return False 快速跳出。写递归的时候,对函数体内返回的递归子程序当作已经成功处理后的结果来处理,思路就变成理所当然了。

复杂度方面:每个节点(left, right)都被调用一次,因此复杂度是O(n), 而不是高度O(lgN).

对高度平衡二叉树的理解是出现变化的,一开始以为是所有叶节点的高度之差只有1,后来发现原来只要左右子树高度之差小于等于1即可。 比如下面这个竟然也是高度平衡二叉树,最高深度为5,最低深度为3。。。

[1,2,2,3,3,3,3,4,4,4,4,4,4,null,null,5,5]

image

class Solution(object):
def isBalanced(self, root):
"""
:type root: TreeNode
:rtype: bool
"""

def check_height(root):
if not root:
return 0

left_height = check_height(root.left)
if left_height is False:
return False

right_height = check_height(root.right)
if right_height is False:
return False

if abs(left_height - right_height) > 1:
return False

return max(left_height, right_height) + 1

return check_height(root) is not False
  • 执行用时:28 ms, 在所有 Python 提交中击败了99.60%的用户
  • 内存消耗:18 MB, 在所有 Python 提交中击败了33.33%的用户
  • failed try

对高度平衡二叉树理解出现错误的时候的写法,以为所有叶节点的高度差最多只有1.


class Solution(object):
def isBalanced(self, root):
"""
:type root: TreeNode
:rtype: bool
"""

def dfs(level, root, rv):
if not root:
rv.append(level)
return
level += 1
dfs(level, root.left, rv)
dfs(level, root.right, rv)

rv = []
dfs(0, root, rv)
maxh, minh = max(rv),min(rv)
return maxh - minh <= 1