输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树
平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
所以主要就是要求出树的高度
初思路:自下往上判断
参考了官方题解
jude递归到最底层,开始判断
深度计数怎么带回上一层递归的问题?
设置参数,并引用,这样每层都会累加深度,每层递归回来,都会带回自己的深度,然后进行判断。
abs函数用来求绝对值
class Solution {
public:
//辅助递归函数
//depth 添加引用,每层都会叠加
bool judge(TreeNode* root, int& depth)
{
if(root == nullptr)
{
return true;
}
int left_depth = 0;
int right_depth = 0;
if(judge(root->left, left_depth) == false
|| judge(root->right, right_depth) == false)
return false;
if(abs(left_depth - right_depth) > 1)
return false;
//更新当前层的depth
depth = left_depth > right_depth ? left_depth + 1: right_depth + 1;
return true;
}
bool IsBalanced_Solution(TreeNode* pRoot)
{
int depth = 0;
return judge(pRoot, depth);
}
};
以子树为例的递归传递图
思路2:从上往下判断
两次递归:
1:求当前root的深度deep,采用递归函数int deep(TreeNode* root)
2:最上方第一个根节点的深度满足要求后,还要去递归判断根节点的左子树和右子树。根节点这棵树的深度满足要求,子树的深度不一定满足。
因为deep函数在求深度时,并没有判断深度是否满足要求。
int deep(TreeNode* root)
{
if(root == nullptr)
return 0;
int left = deep(root->left);
int right = deep(root->right);
return (left > right ? left + 1: right + 1);
}
bool IsBalanced_Solution(TreeNode* pRoot) {
if(pRoot == nullptr)
return true;
int left = deep(pRoot->left);
int right = deep(pRoot->right);
if(abs(left - right) > 1)
return false;
//deep 只能求深度, 如果子树深度不满足,无法跳出
return IsBalanced_Solution(pRoot->left)
&&IsBalanced_Solution(pRoot->right);
}