题目要求:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 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
思路一:
如果是直接采用计算树深度进行对比,无法满足题目要求,树内的每一个结点的每一个子树都必须满足平衡条件
bool Depth(struct TreeNode* root)
{
if (root==NULL)
{
return true;
}
int leftdeep = Depth(root->left);
int rightdeep = Depth(root->right);
return leftdeep - rightdeep > 1 || rightdeep - leftdeep > 1 ? false : true;
}
bool isBalanced(struct TreeNode* root)
{
if (root==NULL)
{
return true;
}
return Depth(root);
}
abs
描述
C 库函数 int abs(int x) 返回 x 的绝对值。
声明
下面是 abs() 函数的声明。
int abs(int x)参数
- x -- 完整的值。
返回值
该函数返回 x 的绝对值。
思路二:
/**
* Definition for a binary tree node.
* 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:
bool isBalanced(TreeNode* root) {
if(root==nullptr)
{
return true;
}
int l_height=0,r_height=0;
while(root->left!=nullptr)
{
l_height++;
root=root->left;
isBalanced(root->left);
}
while(root->right!=nullptr)
{
r_height++;
root=root->right;
isBalanced(root->right);
}
if(abs(l_height-r_height)>2)
{
return false;
}
return true;
}
};
这个思路能够解决一部分的案例,但是对于单边树仍然会报错。
对于root =[1,null,2,null,3]的一棵树,树的所有结点l_height都为0,但是程序递归到节点3时,由于节点3的左右子树为空,所以该节点左右高度都为0,节点2的右高度为1。程序运行结果错误。
思路三:
通过设计一个函数用于计算树的最大深度
通过对每一个结点的最大深度对比,以及每一个结点是否平衡的递归运算,来确定是否是平衡二叉树。
如果一个树是平衡二叉树,那么必须保证其上的每一个子树都平衡
代码实现:
#include<stdio.h>
#include<stdbool.h>
struct TreeNode
{
int val;
struct TreeNode* left;
struct TreeNode* right;
};
int maxDepth(struct TreeNode* root)
{
if (root == NULL)
{
return 0;
}
int leftdeep = maxDepth(root->left);
int rightdeep = maxDepth(root->right);
return leftdeep > rightdeep ? leftdeep + 1 : rightdeep + 1;
}
bool isBalanced(struct TreeNode* root)
{
if (root == NULL)
{
return true;
}
int leftdeep = maxDepth(root->left);
int rightdeep = maxDepth(root->right);
return abs(leftdeep - rightdeep) < 2 && isBalanced(root->left) && isBalanced(root->right);
}