判断一棵树是否为平衡二叉树的算法

上厕所时饶有兴致地看了下leetCode的110题,难度为easy,于是给了自己信心:判断一棵树是否为平衡二叉树。

        平衡二叉树,即一棵树的左子树与右子树的深度之差不能大于1,并且每一个子节点都是平衡二叉树。

此问题解决方案应该有很多,可以递归,也可以不递归,递归当然容易理解,代码也偏少,但使用递归得注意一点,本问题需要完成两步:1、得到一个节点左右子树的深度,计算差值。2、对这棵树的每个子节点均重复1的计算与判断。

1、计算左右子树深度,计算差值,有很好的算法:

    int getTreeDepth(TreeNode* root)
    {
        int deep = 0;
        if(root != NULL)
        {
            int leftDeep = getTreeDepth(root->left);
            int rightDeep = getTreeDepth(root->right);
            deep = leftDeep > rightDeep?leftDeep+1:rightDeep+1;
        }
        return deep;
    }

逻辑就是调用递归遍历左右子树,令最末端的节点深度为1,然后逐层累加即可。

这里参考了:http://www.cnblogs.com/GoAhead/archive/2012/05/22/2513847.html,里面还包含有非递归的取深度,有待学习。

2、对每个节点均执行,做法同上,稍稍有微调,采用先序遍历算法,先计算父节点,然后到两个子。

总的代码如下:

class Solution {
public:
    int getTreeDepth(TreeNode* root)
    {
        int deep = 0;
        if(root != NULL)
        {
            int leftDeep = getTreeDepth(root->left);
            int rightDeep = getTreeDepth(root->right);
            deep = leftDeep > rightDeep?leftDeep+1:rightDeep+1;
        }
        return deep;
    }
public:
    bool isBalanced(TreeNode* root) {
        if(root == NULL)
            return true;
        int leftLv = getTreeDepth(root->left);
        int rightLv = getTreeDepth(root->right);
        int div = leftLv > rightLv?leftLv – rightLv:rightLv – leftLv;
        if(div > 1)
            return false;
        int res = isBalanced(root->left) && isBalanced(root->right);
        if(res)
            return true;
        return false;
    }
};

这是递归的做法,后续有时间可以研究非递归算法。

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/qinqinkittay/article/details/51176780
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞