📟作者主页:慢热的陕西人
🌴专栏链接:力扣刷题日记
📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言
牛客热题:判断是否是平衡二叉树
题目链接
判断是不是平衡二叉树_牛客题霸_牛客网 (nowcoder.com)
方法一:辅助函数+递归
思路
代码
int _Isheight(TreeNode* root)
{
if(root == nullptr) return 0;
int l = 0;
int r = 0;
if(root->left) l = _Isheight(root->left);
if(root->right) r = _Isheight(root->right);
return (l > r ? l : r) + 1;
}
bool IsBalanced_Solution(TreeNode* pRoot)
{
if(pRoot == nullptr) return true;
//看看当前的树是否是平衡树
int l = _Isheight(pRoot->left);
int r = _Isheight(pRoot->right);
//若是则继续看子树
if(abs(l - r) <= 1)
return IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right);
//否则的话直接返回false
else
return false;
}
复杂度
这段代码主要是用来判断一棵二叉树是否是平衡二叉树的。对于时间复杂度和空间复杂度的分析如下:
- 时间复杂度:
_Isheight
函数的时间复杂度为 O(n),其中 n 是树的节点数,因为在每个节点上都会进行用。IsBalanced_Solution
函数中,每个节点的高度计算调用了_Isheight
函数两次(分别计算左子树和右子树的高度),所以时间复杂度为 O(2n),即 O(n)。- 因为在递归调用过程中没有额外的数据结构占用空间,所以空度为 O(1),即常量级空间复杂度。
- 简要分析:
_Isheight
函数用来计算树的高度,时间复杂度为 O(n),空间复杂度为 O(h), 其中h为树的高度,用于建立函数栈帧的开销。IsBalanced_Solution
函数在杂度为 O(h),h为树的高度,用于建立函数栈帧的开销。
方法二:回溯
思路
deep
函数用来计算以node
为根节点的子树的深度。- 如果当前节点为空,则该子树深度为 0,返回 0。
- 分别递归计算左子树和右子树的深度,得到
left
和right
。 - 如果左子树或右子树深度为 -1,说明左子树或右子树不平衡,直接返回 -1。
- 如果左子树和右子树深度之差大于 1,说明当前子树不平衡,直接返回 -1。
- 如果左子树和右子树深度之差小于等于 1,说明当前子树平衡,返回左右子树深度的较大值加上 1。
- 在
IsBalanced_Solution
函数中,如果根节点的深度为 -1,则说明整棵树不平衡,返回 false;否则返回 true,表示整棵树平衡。
代码
bool IsBalanced_Solution(TreeNode* pRoot)
{
if(deep(pRoot)==-1) return false;
return true;
}
int deep(TreeNode* node)
{
if(node == nullptr) return 0;
int left=deep(node->left);
if(left == -1 ) return -1;
int right=deep(node->right);
if(right == -1 ) return -1;
//两个子节点深度之差小于一
if((left-right)>1 || (right-left)>1){
return -1;
}
//父节点需要向自己的父节点报告自己的深度
return (left>right?left:right)+1;
}
复杂度
时间复杂度:O(n)
空间复杂度: O(n),因为需要递归调用的栈空间。