JZ79 判断是不是平衡二叉树

124 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情

Day39 2023/02/14

题目链接

难度:简单

题目

输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。

在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树

平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

样例解释:

样例二叉树如图,为一颗平衡二叉树

注:我们约定空树是平衡二叉树。

数据范围:n≤100,树上节点的val值满足 0≤n≤1000

要求:空间复杂度O(1),时间复杂度 O(n)

输入描述:

输入一棵二叉树的根节点

返回值描述:

输出一个布尔类型的值

思路


根据题目要求,我们可以计算二叉树左右子树的高度差,如果大于1的话就不是平衡二叉树,否则就是,由于一棵二叉树中,除叶子节点外,每一个节点都可以看作成一棵子树的根节点,所以我们用同样的方法去判断每一棵子树是否为平衡二叉树,只要有一棵不符合,整个二叉树就不是平衡二叉树,基于此我们就把一个复杂问题,简化成了多个相同的简单问题,所以使用基于递归的算法最合适,这里选择深度优先算法。
具体步骤:

  1. 调用dfs函数(自定义函数)
  2. 返回flag值

关键点


  • dfs(深度优先算法)的具体实现,递归出口是节点为空或者flag = 0(即不是平衡二叉树)
  • 在原本的深度优先算法的基础上,加上计算高度差的语句,这里使用函数abs计算

算法实现


c++代码实现- 基于深度优先算法

#include <algorithm>
#include <cmath>
class Solution {
public:
    bool IsBalanced_Solution(TreeNode* pRoot) {
        dfs(pRoot);
        return flag;
    }
    private:
        bool flag = 1;  // 判断标志
        int dfs (TreeNode* root) { //深度优先算法
            if (!root || !flag) return 0;
            int left = dfs(root->left);
            int right = dfs(root->right);
            int diff =  abs(left - right); //计算高度差
            if (diff > 1) flag = 0; 
            return max(left, right) +1;
        }
};
  • 时间复杂度 O(n)O(n) --- 访问了二叉树中全部节点,其中n为二叉树中节点个数
  • 空间复杂度 O(1)O(1) --- 无额外的辅助空间

总结

深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(n)O(n)