/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return bool布尔型
*/
// int count;
int height(TreeNode * pRoot) // level 表示当前的层数
{
// int count = 0;
if(pRoot == nullptr)
return 0;
int left = height(pRoot->left);
int right = height(pRoot-> right);
return max(left,right) + 1;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
// write code here
if(pRoot == nullptr)
return true;
//printf("left:%d,right:%d\n",left,right);
bool l = IsBalanced_Solution(pRoot ->left);
if(!l) return false;
bool r = IsBalanced_Solution(pRoot ->right);
if(!r) return false;
// 后序遍历的好处 1。可以降低时间复杂度,比如1这个节点先序把2判断了一次 然后走到2 又判断2 产生了重复计算
int left = height(pRoot ->left);
int right = height(pRoot ->right);
// 分开算高度也会产生重复计算吗,因为算1的高度的时候,已经顺带把2的高度也算出来,但是走到2的时候又会算一遍
// 我们把两个函数都改成后续是为了和2为1
if(abs(left - right)> 1) return false;
return true;
// printf("l:%d,r:%d\n",l,r);
//return false;
return l && r;
}
// 方法2
int dfs(TreeNode* root) // 因为既要返回 是否是平衡二叉树的bool值 又要返回高度
// 所以我们规定返回 -1 为不是平衡二叉树 其他就是高度
{
if(root == nullptr) return 0;
int left = dfs(root->left);
if(left == -1) return -1;
int right = dfs(root->right);
if(right== -1) return -1;
return abs(left -right ) <= 1 ? max(left,right) +1 : -1;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
return dfs(pRoot) != -1;
}
};