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

本文探讨了如何通过递归与非递归方式计算并判断一棵树是否为平衡二叉树,包括深度计算算法及平衡性验证逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上厕所时饶有兴致地看了下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;
    }
};

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值