题目
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过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: TreeNode) -> bool:
return self.deep(root)>=0
def deep(self,root):
# 如果根节点为空,深度为0
if not root:
return 0
## 当当前树不平衡时,返回-1
# 求左子树的深度,如果返回值为-1,说明不平衡,返回
leftdeep = self.deep(root.left)
if leftdeep == -1: return -1
# 求右子树的深度,如果返回值为-1,说明不平衡,返回
rightdeep = self.deep(root.right)
if rightdeep == -1: return -1
## 如果左右子树深度差的绝对值大于1,就返回-1,表示当前树不平衡
if abs(leftdeep-rightdeep)>1: return -1
## 返回当前树的深度(左右子树深度的最大值加1)
return max(leftdeep, rightdeep)+1
复杂度
时间复杂度 O(N): N为树的节点数;最差情况下,需要递归遍历树的所有节点。
空间复杂度 O(N): 最差情况下(树退化为链表时),系统递归需要使用 O(N) 的栈空间。