判断一棵二叉树是否是平衡二叉树(C++)

215 阅读1分钟

剑指 Offer 55 - II. 平衡二叉树 - 力扣(LeetCode) (leetcode-cn.com)

题意

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

思路1

按照题意从上往下的进行判断,对于根节点为root的节点,先求左子树的深度,再求右子树的深度,判断两者深度之差是否超过1.

然后再递归下去分别判断左子树和右子树是否为平衡二叉树。

时间复杂度退化为O(n^2)

因为每个节点都要递归求深度,一直在不断重复的计算。

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root==nullptr) return 0;
        return max(maxDepth(root->left),maxDepth(root->right))+1;
    }
    bool isBalanced(TreeNode* root) {
        if(root==nullptr) return true;
        int depl=maxDepth(root->left);
        int depr=maxDepth(root->right);
        return (abs(depl-depr)<=1)&&isBalanced(root->left)&&isBalanced(root->right);
    }
};

思路2

还有一种从下向上的递归,对于当前遍历到的root节点,先递归的判断左子树跟右子树是否为平衡二叉树,如果是的话,返回高度;否则,返回-1;再判断当前节点的左子树右子树是否相差为1.

这样每个节点都会经过一遍,时间复杂度O(n)

代码2


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root==NULL) return 0;
        int depl=maxDepth(root->left);
        int depr=maxDepth(root->right);
        if(depl==-1||depr==-1) return -1;
        if(abs(depl-depr)>1) return -1;
        return max(depl,depr)+1;
    }
    bool isBalanced(TreeNode* root) {
        return maxDepth(root)>=0;
    }
};