题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
该二叉树不一定是二叉搜索树
分析
每碰到一个节点,就判断以该结点为根的左右子树是否是平衡二叉树(通过求左右子树的树高),然后在判断该结点的左右子树为根的子树是否是平衡二叉树。这样就遍历树中每一个结点,对每个结点都判断是否平衡二叉树。
计算树高代码,最坏情况下单枝树的时间复杂度O(n),空间O(n)
判断是否平衡方法最坏O(n),故这种方法时间
O
(
n
2
)
O(n^2)
O(n2),空间
O
(
n
2
)
O(n^2)
O(n2)
class Solution:
def IsBalanced_Solution(self, root):
if not root:
return True
hl = self.depth(root.left)
hr = self.depth(root.right)
is_balance = abs(hl-hr)<2 and self.IsBalanced_Solution(root.left) and self.IsBalanced_Solution(root.right)
return is_balance
def depth(self, root):
if not root:
return 0
return 1 + max(self.depth(root.left), self.depth(root.right))
s = Solution().IsBalanced_Solution(root)
print(s)
上面代码从根节点开始每次都要重复遍历子树结点,所以时间复杂度高,下面从叶节点开始,依次往上求其子树高度,如果在某一子树上不满足要求,则一路返回,不再继续遍历。时间最坏O(n),空间O(n)
class Solution:
def IsBalanced_Solution(self, root):
return self.depth(root) != -1
def depth(self, root):
if not root:
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)
注意区分这两种方法的不同,及其解决问题思想的差别。在避免树结点的重复遍历上的启示。