题目描述
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: true
示例 2:
输入: root = [1,2,2,3,3,null,null,4,4]
输出: false
分析
整体思路
判断一棵树是否是平衡树,我们可以对其所有子树进行判断,如果该子树的左右高度大于1,则说明该子树不平衡,整棵树也自然不平衡,如果左右子树平衡,则选择更高的树+1作为其根节点的高度,并进行递归。
具体实现
-
我们首先定义递归函数返回类型,我们需要获得当前子树的高度,所以返回值是int类型,传入参数自然是根节点。
-
确定函数类型以及参数后,设置递归的终止条件,当传入的根节点为空时,说明已经是遍历完当前子树的叶子节点了,我们返回0,表示当前子树的高度为0,方便计算。
-
接下来就是最关键的一步,递归的单层,我们首先明确,当一棵树如果他的左右子树不平衡,我们将其根节点赋值为-1,当有一个根节点为-1,则说明整个树也一定不平衡;我们判断一棵树是否平衡,需采用后序遍历,只有后序遍历才能在获取到左右子树高度后,进行平衡的判定,所以我们先获取这棵树的所有左右子树高度,如果左右子树存在不平衡的情况,则直接返回-1;当左右子树都是平衡,再判断当前节点的左右子树是否平衡,我们将左右子树高度进行减法,如果绝对值大于1,则不平衡,返回-1,如果小于等于1,则说明左右子树平衡,我们需要将返回当前节点的高度,也就是左右子树中更大的高度加上当前节点本身所在的位置1即可。
代码实现
int getHeight(struct treeNode* p){
//递归终止条件
if(p==NULL) return 0;
//左右子树不平衡的情况
int leftHeight = getHeight(p->left);
if(leftHeight == -1) return -1;
int rightHeight = getHeight(p-right);
if(rightHeight == -1) return -1;
//判断当前节点的左右子树是否平衡
return fabs(leftHeight - rightHeight) > 1 ? -1 : fmax(leftHeight,rightHeight) + 1;
}
bool isBalanced(struct TreeNode* root){
return getHeight(root) == -1 ? false : true;
}