【LeetCode & 剑指offer刷题】树题5:110 Balanced Binary Tree

【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

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]:
Return true.
 
Example 2:
Given the following tree [1,2,2,3,3,null,null,4,4]:
Return false.
 
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
 
/*
对于每一个节点,我们通过checkDepth方法递归获得左右子树的深度,
如果子树是平衡的,则返回真实的深度,若不平衡,直接返回-1
此方法时间复杂度O(N),空间复杂度O(H)
 
对于用递归求解的题,可以画递归树来分析
*/
class Solution
{
public:   
    bool isBalanced(TreeNode *root)
    {
        if (checkDepth(root) == -1) return false;
        else return true;
    }
   
    //类似问题:104. Maximum Depth of Binary Tree
    int checkDepth(TreeNode *root)
    {
        if (!root) return 0; //为空时,返回深度
       
        int left = checkDepth(root->left); //返回左子树的深度,如果不平衡,返回-1
        if (left == -1) return -1; //只要哪里有-1一路返回,直到递归结束
       
        int right = checkDepth(root->right); //返回右子树的深度
        if (right == -1) return -1;
       
        int diff = abs(left - right); //计算左右子树的深度差,如果不平衡,返回-1,平衡则返回实际深度
        if (diff > 1)
            return -1;
        else
            return 1 + max(left, right);
    }
};
 

 

posted @ 2019-01-05 19:30  wikiwen  阅读(164)  评论(0编辑  收藏  举报