剑指offer 60. 平衡二叉树

✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:剑指offer系列题解
📝原题地址:题目地址
📣专栏定位:为找工作的小伙伴整理常考算法题解,祝大家都能成功上岸!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

题目描述

输入一棵二叉树的根结点,判断该树是不是平衡二叉树。

如果某二叉树中任意结点的左右子树的深度相差不超过 1,那么它就是一棵平衡二叉树。

注意:

  • 规定空树也是一棵平衡二叉树。
数据范围

树中节点数量 [0,500]。

样例
输入:二叉树[5,7,11,null,null,12,9,null,null,null,null]如下所示,
  5
 / \
7  11
  /  \
 12   9

输出:true

方法一:dfs O(n)

这道题只要求我们去判断该树是否为平衡二叉树,不用我们写出完整的代码,如果想对平衡二叉树深入了解的话可以去看看我之前的图解,平衡二叉树也是数据结构必须掌握的知识,传送门放在这里了~

平衡二叉树详细讲解

我们回到这题,如果结果返回 true 则需要满足:

  1. 如果 root 是空,则直接返回 true
  2. 当前 root 需要满足左子树的最大深度与右子树的最大深度只差的绝对值小于等于 1
  3. 右子树和左子树也需要满足平衡树的要求。

这道题其实是上一道题即求二叉树的深度的扩展,深度的求法和那道题一模一样,先去递归到二叉树的叶子结点再回溯,返回的值是 max(左子树深度,右子树深度) + 1

然后我们只需要用获得的深度进行判断,同样也是递归到叶子结点,然后回溯判断每个结点是否都满足平衡二叉树的要求。

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

欢迎大家在评论区交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值