110. Balanced Binary Tree

仅供自己学习

思路:
自顶向下:
可以递归到最低层开始计算层数,当root为NULL时,就返回0,说明是最底一层。然后到上一个递归,因为上一个递归的root不为空,那么我们就return 左右子树中的最大层数+1,那么倒数第二层就是0+1,如此就能得到一个子树的最大深度了。这就是递归函数的内容,即获得最大深度。
主函数的内容就是判断源节点是否为空,如果不为空就return 源节点的左子树深度减去右子树深度的绝对值是否小于等于1,不是只等于1是因为还有[1]只有一个元素的情况。主函数是返回结果的函数,如果只是判断深度是否小于等于1,是不对的,因为有可能左右子树最深深度相差为1,但是是不平衡的,所以我们同时要判断源节点的left和right子树是否为平衡的,同样要从最底层开始往上判断,所以我们return还要递归主函数。
因为是递归的判断左右子树深度是否大于1,同时判断左右子树是否平衡,所以是自顶向下的
因为会遍历到每个节点,那么就是O(n),然后对于深度为d的节点p,会调用d次求深度的函数,因为遍历各子树,则为O(logn),那么就是O(nlogn)。
代码:

/**
 * 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 high(TreeNode* root){
        if(root==NULL) return 0;
        return max(high(root->left),high(root->right))+1;
    }
    bool isBalanced(TreeNode* root) {
        if(root==NULL) return true;
        return abs(high(root->left)-high(root->right))<=1&&isBalanced(root->left)&&isBalanced(root->right);
    }
};

自底向上:
因为自顶向上会把所有结点都遍历,并且会重复遍历各子树。所以我们自底向上,如果遇到失衡的情况就直接返回-1退出,并且不会重复遍历子树。再计算高度的同时同时判断失衡,就能不用重复递归树了。

代码:

/**
 * 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 high(TreeNode* root){
        if(root==NULL) return 0;
        int rt;
        int lt;
        if((rt=high(root->right))==-1||(lt=high(root->left))==-1||abs(rt-lt)>1) return -1;  
        return max(rt,lt)+1;
    }
    bool isBalanced(TreeNode* root) {
        if(root==NULL) return true;
        return high(root)!=-1;
    }
};
posted @ 2021-04-01 17:30  Mrsdwang  阅读(31)  评论(0编辑  收藏  举报