【题目描述】
给定一个二叉树,判断它是否是 平衡二叉树 。
【测试用例】
示例1:
输入:root = [3,9,20,null,null,15,7]
输出:true
示例2:
输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
示例3:
输入:root = [ ]
输出:true
【思路分析】
左右子树的深度之差不超过1则称该树为平衡二叉树。在这道题中,首先,空树一定是平衡二叉树,单独处理。然后,对于非空树,需要判断其左右子树的深度,这里仍然使用递归的思想,用一个countHigh函数来计算深度,通过传入root->left和root->right来分别计算左右子树的深度left和right,如果left和right等于-1,则表示树失衡,返回-1,否则返回left和right中较大的一个值+1(+1是因为这里返回是返回给上层递归,加的1表示上一层)。
【参考代码】
C实现
#include <stdio.h>
//easy-110-平衡二叉树
int count(struct TreeNode* root);
bool isBalanced(struct TreeNode* root);
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int countHigh(struct TreeNode* root){
if(NULL == root){
return 0;
}
int left = countHigh(root->left);
if(left == -1){
return -1;
}
int right = countHigh(root->right);
if(right == -1){
return -1;
}
if(abs(left - right) > 1){
return -1;
}else{
return left > right ? left + 1 : right + 1;
}
}
bool isBalanced(struct TreeNode* root) {
return countHigh(root)==-1 ? false : true;
}
C++实现
#include <iostream>
using namespace std;
//easy-110-平衡二叉树
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
int countHigh(TreeNode* root);
bool isBalanced(TreeNode* root);
};
int Solution::countHigh(TreeNode* root){
if(NULL == root){
return 0;
}
int left = countHigh(root->left);
if(left == -1){
return -1;
}
int right = countHigh(root->right);
if(right == -1){
return -1;
}
if(abs(left - right) > 1){
return -1;
}else{
return max(left, right) + 1;
}
}
bool Solution::isBalanced(TreeNode* root){
return countHigh(root)==-1 ? false : true;
}