zoukankan      html  css  js  c++  java
  • 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))
    
  • 相关阅读:
    jquery 代码搜集
    Windows Server 2008中安装IIS7.0
    javascript 判断两个日期之间的天数 兼容ie,firefox
    jquery选择器大全
    原始ajax方式调用asp.net后台方法
    JavaScript及C# URI编码详解
    利用JQuery直接调用asp.net后台方法
    C#操作XML小结_转载
    从bnbt tracker源码分析bt客户端与traker的通信
    传说中的神器: shared_ptr/weak_ptr/scoped_ptr
  • 原文地址:https://www.cnblogs.com/bonelee/p/9180555.html
Copyright © 2011-2022 走看看