• leetcode 110. Balanced Binary Tree


    Given a binary tree, determine if it is height-balanced.

    For this problem, a height-balanced binary tree is defined as:

    a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

    Example 1:

    Given the following tree [3,9,20,null,null,15,7]:

        3
       / 
      9  20
        /  
       15   7

    Return true.

    Example 2:

    Given the following tree [1,2,2,3,3,null,null,4,4]:

           1
          / 
         2   2
        / 
       3   3
      / 
     4   4
    

    Return false.

    # 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):
            """
            :type root: TreeNode
            :rtype: bool
            """
            def helper(node):
                if not node:
                    return True, 0        
                l_b, l_h = helper(node.left)
                r_b, r_h = helper(node.right)
                if not l_b or not r_b or abs(l_h-r_h) > 1:
                    return False, max(l_h, r_h)+1
                return True, max(l_h, r_h)+1
            
            ans, _ = helper(root)
            return ans
    

    或者是直接在获取tree高度的时候用一个成员变量来记录是否平衡。

    # 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):
            """
            :type root: TreeNode
            :rtype: bool
            """
            self.ans = True
            def get_depth(node):
                if not node:
                    return 0        
                l, r = get_depth(node.left), get_depth(node.right)
                if abs(l-r) > 1:
                    self.ans = False
                return max(l, r)+1
            
            get_depth(root)
            return self.ans
    

    另外的解法就是使用高度是否为-1来标识是否平衡。

    class solution {
    public:
    int dfsHeight (TreeNode *root) {
            if (root == NULL) return 0;
            
            int leftHeight = dfsHeight (root -> left);
            if (leftHeight == -1) return -1;
            int rightHeight = dfsHeight (root -> right);
            if (rightHeight == -1) return -1;
            
            if (abs(leftHeight - rightHeight) > 1)  return -1;
            return max (leftHeight, rightHeight) + 1;
        }
        bool isBalanced(TreeNode *root) {
            return dfsHeight (root) != -1;
        }
    };
    

     最笨的方法就是N^2复杂度的:

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        # @param {TreeNode} root
        # @return {boolean}
        def isBalanced(self, root):
            if not root:
                return True
    
            return abs(self.getHeight(root.left) - self.getHeight(root.right)) < 2 and self.isBalanced(root.left) and self.isBalanced(root.right)
    
        def getHeight(self, root):
            if not root:
                return 0
    
            return 1 + max(self.getHeight(root.left), self.getHeight(root.right))
    
  • 相关阅读:
    Linux基础命令-cp
    Linux基础命令-mkdir
    Linux基础命令-touch
    Linux基础命令-diff
    Linux基础命令-cut
    Linux基础命令-stat
    System.Web.HttpException: 请求在此上下文中不可用
    数据库日志删除、压缩操作
    如何收缩和删除SQL日志文件
    Excel 常用宏代码大全
  • 原文地址:https://www.cnblogs.com/bonelee/p/9180555.html
Copyright © 2020-2023  润新知