剑指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

 

posted @ 2022-07-25 10:00  Liang-ml  阅读(38)  评论(0)    收藏  举报