剑指offer 55. 平衡二叉树
题目:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 简单
方法一:常规递归 时间复杂度O(nlogn) 空间复杂度O(n)
想要判断一颗二叉树是不是平衡二叉树,则需要满足其左右子树都是平衡二叉树,且左右子树高度差小于等于1,即我们需要两个返回值,高度和是否平衡
def isBalanced(root): """ :type root: TreeNode :rtype: bool """ def ib(root): if root is None: return True,0 l_balance,l_level = ib(root.left) r_balance,r_level = ib(root.right) balance = l_balance and r_balance and abs(l_level - r_level) <= 1 level = max(l_level,r_level) + 1 return balance,level return ib(root)[0]
方法二:后序遍历 + 剪枝 时间复杂度O(n) 空间复杂度O(n)
把平衡问题全看成高度问题,后续遍历二叉树,如果某个子树不平衡,那就认定他的高度是-1,加上随时遇到-1就返回的剪枝,提升速度
def isBalanced(root): """ :type root: TreeNode :rtype: bool """ def recur(root): if root is None: return 0 left = recur(root.left) if left == -1: return -1 right = recur(root.right) if right == -1: return -1 return max(left,right) + 1 if abs(left - right) <= 1 else -1 return recur(root) != -1

浙公网安备 33010602011771号