LeetCode-Python-110. 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

       1
      / \
     2   2
    / \
   3   3
  / \
 4   4

第一种思路:

对于每个node,都判断一下其左右子树的相对高度,然后根据相对高度判断这个node满不满足条件,

再递归地判断其左右孩子满不满足条件。

这种思路会重复计算高度,所以会慢。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        
        if not root:
            return True
        
        def getHeight(node, h):
            if not node:
                return h
            h += 1
            return max(getHeight(node.left, h),getHeight(node.right, h))

        
        l_height = getHeight(root.left, 0)
        r_height = getHeight(root.right, 0)
        
        return abs(l_height - r_height) <= 1 and self.isBalanced(root.left) and self.isBalanced(root.right)

第二种思路:

学习自评论区,

如果每一步都计算树高,效率太低,故转变了思想。 递归判断每一个节点的均衡状态,并且只计算一次树高,直至根节点。

class Solution(object):
    def isBalanced(self, root):
        if not root:
            return True
        
        def check(root,height):
            if not root:
                return True,height
            
            tag1,height1=check(root.left,height+1)
            tag2,height2=check(root.right,height+1)
            if tag1 and tag2 and abs(height1-height2)<2:
                return True,max(height1,height2)
            else:
                return False,height1
            
        tag,height=check(root,0)
        return tag  

猜你喜欢

转载自blog.csdn.net/qq_32424059/article/details/89286764