1. 题目

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1 。

示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:true

img

示例 2: 输入:root = [1,2,2,3,3,null,null,4,4] 输出:false

img

示例 3: 输入:root = [] 输出:true

提示: 树中的节点数在范围 [0, 5000] 内 -104 <= Node.val <= 104

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/balanced-binary-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题思路

这题做的太曲折了。一开始定义没整明白,做了很多无用功。后来明确题意了,又因为以前做过的一道题陷入了思维定式,做的非常复杂。

明确题意:

它是一棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树

明确题意就好做了

3. 代码

3.1. 1.0

黑历史,这版代码写的又臭又长

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool help(TreeNode* L,TreeNode* R){
        if(!L&&!R) return true;
        else if(L&&!R){
            if(L->left||L->right) return false;
            else return true;
        }else if(!L&&R){
            if(R->left||R->right) return false;
            else return true;
        }
        else {
            bool flag = help(L->left,L->right) && help(R->left,R->right);
            if(L->left && !L->right) flag = flag && (help(L->left,R->left) || help(L->left,R->right));
            else if(L->right && !L->left) flag = flag && (help(L->right,R->left) || help(L->right,R->right));

            else if(!L->left && !L->right) flag = flag && (help(L->left,R->left) && help(L->left,R->right) );

            else if(L->left && L->right) flag = flag && (help(L->left,R->left) || help(L->left,R->right) || help(L->right,R->left) || help(L->right,R->right));

            if(!R->left && !R->right) flag = flag &&(help(L->left,R->left) && help(L->right,R->left));

            return flag;
        }

    }
    bool isBalanced(TreeNode* root) {
        if(!root) return true;
        return help(root->left,root->right);
    }
};

3.2. 2.0

这版递归,重复计算了很多东西。可以改进为提前判断。

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

3.3. 3.0

但是,貌似时间性能并没有改善

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int height(TreeNode* root){
        if(!root) return 0;
        int leftHeight = height(root->left);
        if(leftHeight == -1) return -1;
        int rightHeight = height(root->right);
        if(rightHeight == -1) return -1;
        if(abs(leftHeight-rightHeight)>1) return -1;
        return max(leftHeight,rightHeight)+1;
    }
    bool isBalanced(TreeNode* root) {
        return height(root)>=0;
    }
};

results matching ""

    No results matching ""