• [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.

    给定一个二叉树,判断是否高度平衡。高度平衡二叉树的定义:二叉树的任意节点的两个子树的深度差不超过1。

    解法:根据定义,只需要判定一颗二叉树的左右子树高度的高度差是否小于等于1。递归处理每一颗二叉树左右子树的高度,并进行判断再回溯。

    Java:

    class Solution {
        int abs(int x) {
            return x > 0 ? x : -x;
        }
        
        int check(TreeNode* root) {
           if (!root) return NULL;
           
           int lch = check(root -> left);
           int rch = check(root -> right);
           // 检查子树是否存在不平衡
           if (lch == -1 || rch == -1 || abs(lch - rch) > 1) return -1;
           
           // 返回当前子树高度
           return (lch > rch ? lch : rch) + 1;
        }
    public:
        bool isBalanced(TreeNode* root) {
            return check(root) != -1;
        }
    };  

    Java:  without ResultType

    public class Solution {
        public boolean isBalanced(TreeNode root) {
            return maxDepth(root) != -1;
        }
    
        private int maxDepth(TreeNode root) {
            if (root == null) {
                return 0;
            }
    
            int left = maxDepth(root.left);
            int right = maxDepth(root.right);
            if (left == -1 || right == -1 || Math.abs(left-right) > 1) {
                return -1;
            }
            return Math.max(left, right) + 1;
        }
    } 

    Python:

    class TreeNode:
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    class Solution:
        # @param root, a tree node
        # @return a boolean
        def isBalanced(self, root):
            return (self.getHeight(root) >= 0)
        
        def getHeight(self, root):
            if root is None:
                return 0
            left_height, right_height = self.getHeight(root.left), self.getHeight(root.right)
            if left_height < 0 or right_height < 0 or abs(left_height - right_height) > 1:
                return -1
            return max(left_height, right_height) + 1 

    Python:

    class Solution:
        """
        @param root: The root of binary tree.
        @return: True if this Binary tree is Balanced, or false.
        """
        def isBalanced(self, root):
            balanced, _ = self.validate(root)
            return balanced
            
        def validate(self, root):
            if root is None:
                return True, 0
                
            balanced, leftHeight = self.validate(root.left)
            if not balanced:
                return False, 0
            balanced, rightHeight = self.validate(root.right)
            if not balanced:
                return False, 0
                
            return abs(leftHeight - rightHeight) <= 1, max(leftHeight, rightHeight) + 1  

    C++:

    class Solution {
    public:
        bool isBalanced(TreeNode *root) {
            if (!root) return true;
            if (abs(getDepth(root->left) - getDepth(root->right)) > 1) return false;
            return isBalanced(root->left) && isBalanced(root->right);    
        }
        int getDepth(TreeNode *root) {
            if (!root) return 0;
            return 1 + max(getDepth(root->left), getDepth(root->right));
        }
    };
    

    C++:

    class Solution {
    public:    
        bool isBalanced(TreeNode *root) {
            if (checkDepth(root) == -1) return false;
            else return true;
        }
        int checkDepth(TreeNode *root) {
            if (!root) return 0;
            int left = checkDepth(root->left);
            if (left == -1) return -1;
            int right = checkDepth(root->right);
            if (right == -1) return -1;
            int diff = abs(left - right);
            if (diff > 1) return -1;
            else return 1 + max(left, right);
        }
    };
    

    C++:

    /**
     * Definition of TreeNode:
     * class TreeNode {
     * public:
     *     int val;
     *     TreeNode *left, *right;
     *     TreeNode(int val) {
     *         this->val = val;
     *         this->left = this->right = NULL;
     *     }
     * }
     */
    class Solution {
    public:
        int depth(TreeNode *root) {
            if (root == NULL) {
                return 0;
            }
            int left = depth(root->left);
            int right = depth(root->right);
            if (left == -1 || right == -1 || abs(left - right) > 1) {
                return -1;
            }
            return max(left, right) + 1;
        }
    
        /**
         * @param root: The root of binary tree.
         * @return: True if this Binary tree is Balanced, or false.
         */
        bool isBalanced(TreeNode *root) {
            return depth(root) != -1;
        }
    };
    

      

       

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    android 网络
    java 软引用,弱引用,强引用
    android 定时, 延时 任务
    android 不失真 显示 超高清 图片 长图
    android viewHolder static 静态
    工作中怎么解决bug
    chkconfig命令
    chkconfig命令
    chkconfig命令
    linux安装 pip和setuptools
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8621451.html
Copyright © 2020-2023  润新知