给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过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 。
思路1:
递归解法。首先判断是否空树,然后判断左右节点的深度差绝对值是否大于1,如果本层没有问题,在判断左右子树是否是平衡二叉树。
判断深度时也使用递归。
代码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 depth(self,root):
if root==None:
return 0
left=self.depth(root.left)
right=self.depth(root.right)
return max(left,right)+1
def isBalanced(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if root==None:
return True
if abs(self.depth(root.left)-self.depth(root.right))>1:
return False
else:
return self.isBalanced(root.left)& self.isBalanced(root.right)
分析1:
我对于二叉树这块的递归解法还是有一些抗拒,因为算法效率不高,又使用Python语言。但总体思路还是清晰的。
使用master公式求时间复杂度为O(nlogn)
思路2:
观察思路1可发现它对于一个节点多次判断导致效率低下。因此做出修正,对一个数的判断自下而上,判断其子树是否是平衡的,若不平衡直接结束程序。这样每个节点最多被判断一次,极大地提升了效率。
代码2:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def depth(self,root):
if root==None:
return 0
left=self.depth(root.left)
if left==-1:
return -1
right=self.depth(root.right)
if right==-1:
return -1
return -1 if abs(left-right)>1 else 1+max(left,right)
def isBalanced(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
return self.depth(root)!=-1
分析3:
本方法思路来源参考https://www.nowcoder.com/questionTerminal/8b3b95850edb4115918ecebdf1b4d222