55-II. 平衡二叉树

1. 描述

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

2. 例子

示例 1:
给定二叉树 [3,9,20,null,null,15,7],
返回 true 。

示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
返回 false 。

3. 限制

  • 1 <= 树的结点个数 <= 10000

4. 题解

n 是 i_root 中的节点个数
时间复杂度: O(n)
空间复杂度: O(n)

也可以令返回是否平衡的递归函数同时返回深度和是否平衡,可以省去哈希表,但是不影响复杂度。

class Solution 
{
private:
    unordered_map<TreeNode*, int> subTreeDepth;

    bool isTreeBalanced(TreeNode *i_root)
    {
        if(!i_root->left && !i_root->right)
        {
            subTreeDepth[i_root] = 1;
            return true;
        }
        
        auto isLeftSubTreeBalanced = true, isRightSubTreeBalanced = true;
        if(i_root->left) isLeftSubTreeBalanced = isTreeBalanced(i_root->left);
        if(i_root->right) isRightSubTreeBalanced = isTreeBalanced(i_root->right);

        subTreeDepth[i_root] = 1 + max(subTreeDepth[i_root->left], subTreeDepth[i_root->right]);
        
        return isLeftSubTreeBalanced && isRightSubTreeBalanced && abs(subTreeDepth[i_root->left] - subTreeDepth[i_root->right]) <= 1;
    }
public:
    // bool isBalanced(TreeNode* root)
    bool isBalanced(TreeNode *i_root) 
    {
        if(!i_root) return true;

        subTreeDepth[nullptr] = 0;
        return isTreeBalanced(i_root);
    }
};
comments powered by Disqus