110. 平衡二叉树
题意:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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
解题思路:
- 需要先了解平衡树概念,就是单曲节点的左节点和右节点高度之差的绝对值要小于等于1.也就是
abs(leftHeight - rightHeight) > 1
.如果大于1说明它不平衡.
问 答 判断平衡树需要每个节点都判断,那么如何开始好呢? 从底部开始,因为底部不平衡,说明整个都不平衡了. 怎么到底部呢? 递归可以先判断底部 递归终止条件? if (!root) return 0;
怎么判断是否平衡? 可以获取每个节点左节点,右节点高度.绝对值之差大于1就不平很.返回 -1
返回结果? 需要返回子节点层数最大的层数再加 1
(本身算一层).这样,递归也算是完成的差不多了.依照这个思路写.
代码:
int getHeight(TreeNode* root)
{
if (!root)
return 0;
//获取左孩子节点高度,如果为空节点那么本身就为1.
int leftHeight = getHeight(root->left);
//获取右孩子节点高度
int rightHeight = getHeight(root->right);
//如果有-1,说明已经不平衡了
if (leftHeight == -1 || rightHeight == -1)
return -1;
//判断是否两边的层数大于1;
return abs(leftHeight - rightHeight) > 1 ? -1 : max(leftHeight, rightHeight) + 1;
}
bool isBalanced(TreeNode* root) {
return getHeight(root) == -1 ? false : true;
}
总结:
判断是否平衡用递归比较容易完成,只需要得到左孩子和右孩子的高度的差的绝对值做一个判断即可.就是递归的可能有点绕,需要自己琢磨一下.