一、题目描述与要求
题目描述
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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
提示
- 树中的节点数在范围
[0, 5000]
内 -104 <= Node.val <= 104
二、解题思路
总的思路:
题目要求对给定的二叉树进行判断,判断其是否为高度平衡的二叉树。一颗高度平衡的二叉树在于每个节点的左右两个子树的高度差的绝对值不超过1,因此要判断一颗二叉树是否为高度平衡树需要对其每一个结点的左右子树的深度进行判断,一旦出现高度差绝对值超过1的肯定不是平衡二叉树。因此首先可以判断这颗二叉树是否为空树或者是否只有一个根结点,是的话返回true因为无论是空树还是只有根结点的二叉树都是平衡二叉树。接着就要对每个结点的左右子树的深度的绝对值进行判断,大于1则不是平衡二叉树返回false。接着就是对每个结点以此调用isBalanced函数进行判断是否为平衡二叉树。求深度函数主要是首先定义一个初始化的变量depth,因为在调用求深度函数的时候如果结点为空则直接返回0,如果不为空的话深度必然至少为1,因此在对此结点的左右子树进行求深度的时候要记录上结点深度1。接着就是对结点的左右子树依次调用求深度函数求出子树的高度并返回。
具体步骤:
1、判断二叉树是否为空或者是否只有根结点,是的话返回true。
2、调用Depth函数求结点的左右子树的高度相减并判断结果的绝对值是否大于1,是的话返回false。求子树深度的时候判断结点是否为空,为空该子树高度为0;结点不为空的情况下调用Depth函数求结点的左右子树的深度;最后进行判断如果左子树的深度大于右子树的深度则返回左子树的深度,否则返回右子树的深度来作为该结点的最大深度从而与兄弟结点的深度进行相减判断是否为平衡二叉树。
3、对结点的左右子树的左右子树调用isBalanced函数判断是否为平衡二叉树。
三、具体代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int Depth(struct TreeNode* root)
{
int depth=1;//作为子树只有一个结点时的初始深度
int leftDepth=1,rightDepth=1;
if(root==NULL)//如果结点为空则此子树深度为0
return 0;
if(root->left!=NULL)
{
leftDepth=depth+Depth(root->left);
}
if(root->right!=NULL)
{
rightDepth=depth+Depth(root->right);
}
if(leftDepth>=rightDepth)
return leftDepth;
else
return rightDepth;
}
bool isBalanced(struct TreeNode* root){
if(root==NULL||(root->left==NULL&&root->right==NULL))//当二叉树为空树或者只有根结点时为高度平衡二叉树
return true;
else if(abs(Depth(root->left)-Depth(root->right))>1)//如果根结点的左子树的深度减去右子树的深度的绝对值大于1就代表不是高度平衡二叉树
{
return false;
}
//对每个结点的左右子树依次进行判断
return isBalanced(root->left)&&isBalanced(root->right);
}