110.[Leetcode]Balanced Binary Tree

题意:

判断一个二叉树是不是平衡二叉树

别人的思路:

使用递归对于每一个点判断是否平衡点,所以需要一个计算此点深度的getDepth()方法

int  getDepth(TreeNode *node)
{
    int left =0;
    int right=0;

    if (node == NULL)
    return 0;

    if (node->left != NULL)
    left = getDepth(node->left);

    if (node->right != NULL)
    right = getDepth(node->right);

    return (left > right? left : right) + 1;
}
bool isBalanced(TreeNode* root) {

    if (root == NULL)
    return true;

    if (abs(getDepth(root->left) - getDepth(root->right)) > 1)
       return false;

    return (isBalanced(root->left) && isBalanced(root->right));

}

我的思路:

这题我的方法beat 80%,虽然也不是很多但是是我个人的新高啊!

而且看起来简洁很多有木有!

class Solution {
public:
    bool isBalanced(TreeNode* root) {
        bool the = true; 
        //这里这个布尔值the,之后作为引用传入的,之所以作为引用是因为我希望在不断的递归中一直用the来存储是否仍旧满足平衡树条件
        btree(0,root,the);
        return the;
    }

    int btree(int i,TreeNode* node, bool &the){ //btree是返回此树的深度的

        if(node == NULL || the == false) return i; //如果该节点为NULL,说明递归到底了,可以返回,或者前面已经判断存在 非平衡状态了,那么之后就其实没必要递归了,也直接返回

        int left = btree(i+1,node->left,the);
        int right = btree(i+1,node->right,the);
        if(left-right > 1 || right-left > 1) the = false; //计算出左右节点的深度,如果绝对值大于1,则the置为false,the是引用,可以想象成全局的

        return max(left,right); //此节点的高度为子节点最大值
    }
};

Tips:

在思考算法的时候,我进了一个坑,那就是想存储所有叶子结点的大小,然后比较最大值和最小值差值是否大于1.

但是这是错误的思路,因为一个节点的深度是其 最大深度

比如一个节点

左边,最深是 5

右边,最深是 4,但是存在 3 的子节点

此节点是平衡的,但是存在 5-3 > 1

你可能感兴趣的:(LeetCode)