开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情
Day39 2023/02/14
难度:简单
题目
输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。
在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
样例解释:
样例二叉树如图,为一颗平衡二叉树
注:我们约定空树是平衡二叉树。
数据范围:n≤100,树上节点的val值满足 0≤n≤1000
要求:空间复杂度O(1),时间复杂度 O(n)
输入描述:
输入一棵二叉树的根节点
返回值描述:
输出一个布尔类型的值
思路
根据题目要求,我们可以计算二叉树左右子树的高度差,如果大于1的话就不是平衡二叉树,否则就是,由于一棵二叉树中,除叶子节点外,每一个节点都可以看作成一棵子树的根节点,所以我们用同样的方法去判断每一棵子树是否为平衡二叉树,只要有一棵不符合,整个二叉树就不是平衡二叉树,基于此我们就把一个复杂问题,简化成了多个相同的简单问题,所以使用基于递归的算法最合适,这里选择深度优先算法。
具体步骤:
- 调用dfs函数(自定义函数)
- 返回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;
}
};
- 时间复杂度 --- 访问了二叉树中全部节点,其中n为二叉树中节点个数
- 空间复杂度 --- 无额外的辅助空间
总结
深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为