首先得知道什么是平衡二叉树?
平衡二叉树定义:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
那么我们有了第一个思路,先写一个求树深度的函数,
然后对每个子树均使用该函数求深度,并且判断左右子树深度差是否大于1.
即首先判断root是否为空,如果为空,则return True,否则继续判断root的left和right子树深度差是否大于1,如果大于1,return False,否则继续递归判断root left的左右子树和root right的左右子树,如果都为True,则返回True,否则返回False。
这里需要注意的是,求深度的代码,用之前我自己的思路写,不太方便,还是直接用max函数的那个求深度的代码,好用点。
上代码:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def IsBalanced_Solution(self, pRoot):
# write code here
def DFS(root):
if root is None:
return 0
count = max(DFS(root.left),DFS(root.right)) + 1
return count
if pRoot is None:
return True
if abs(DFS(pRoot.left)-DFS(pRoot.right)) > 1:
return False
if self.IsBalanced_Solution(pRoot.left) and self.IsBalanced_Solution(pRoot.right):
return True
return False
这种做法有很明显的问题,在判断上层结点的时候,会多次重复遍历下层结点,增加了不必要的开销。
如果改为从下往上遍历,如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,这样至多只对每个结点访问一次。
直接看代码的注释就懂了。
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def IsBalanced_Solution(self, pRoot):
# write code here
def helper(root):
if root is None: # 这是给叶子结点的
return 0
left = helper(root.left)
right = helper(root.right)
# 左子树不平衡,或右子树不平衡,或当前树结点不平衡 直接返回-1
if left == -1 or right == -1 or abs(left-right) > 1:
return -1
return 1 + max(left,right) # 返回当前树的深度
if pRoot is None:
return True
if helper(pRoot) != -1:
return True
else:
return False