leetcode--python--剑指 Offer 55 - II

平衡二叉树

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树
参考讨论区《普通人能想到的解法》
代码分析已经写进代码注释里面,主要可能难理解的是哪里用了先序遍历,时间复杂度O(NlogN),空间复杂度O(N),递归需要O(N)的栈空间

# 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:
        if not root:
            return(True)
        #访问根节点,判断根节点是否是平衡二叉树
        left_height = self.depth(root.left)
        right_height = self.depth(root.right)
        if abs(left_height - right_height) > 1:
            return(False)
        else:
            #访问左节点、右节点,判断左右节点是否是平衡二叉树
            return(self.isBalanced(root.left) and self.isBalanced(root.right))
        #从上面的注释和代码可以看出,函数先访问的根节点再访问的左节点最后访问的右节点,所以是先序遍历的方法
    def depth(self, root):
        if not root:
            return(0)
        return(max(self.depth(root.left), self.depth(root.right)) + 1)

方法二:后序遍历,时间复杂度空间复杂度均为O(N)

#由于先序遍历是从上往下的遍历,而我们完全可以从下往上访问,下面的某个节点不是平衡的就直接返回,不用像先序遍历时要访问每一个节点

       # 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:
        #由于先序遍历是从上往下的遍历,而我们完全可以从下往上访问,下面的某个节点不是平衡的就直接返回,不用像先序遍历时要访问每一个节点

        def precur(root):
            if not root:
                return(0)
            left_height = precur(root.left)
            if left_height == -1:
                return(-1)
            right_height = precur(root.right)
            if right_height == -1:
                return(-1)
            return(max(left_height,  right_height) + 1 if abs(left_height - right_height) <= 1 else -1)#当left_height - right_height小于1时,返回节点的深度;否则返回-1,
        return(precur(root) != -1)

你可能感兴趣的:(leetcode-python)