110.给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
- 递归解法如下:递归地求解左右子树是否为平衡二叉树,求左右子树是否为平衡二叉树的方法是对求高度的递归函数进行一些改造,当求出来的左右子树的高度差大于1的时候就返回-1,表明此时已经不满足平衡二叉树的定义了。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int getHeight (struct TreeNode* root) {
/* 原先求高度的递归函数
if (root == NULL)
return 0;
int left = getHeight(root->left);
int right = getHeight(root->right);
return left > right ? left + 1 : right + 1;
*/
if (root == NULL)
return 0;
int left = getHeight(root->left);
if (left == -1)
return -1;
int right = getHeight(root->right);
if (right == -1)
return -1;
return abs(left - right) > 1 ? -1 : (left > right ? left + 1 : right + 1) ;
}
bool isBalanced(struct TreeNode* root){
return getHeight(root) == -1 ? false : true;
}
该题的递归解法确实一开始没有想到要怎么写,有想到是要递归地求解高度,但写着写着就绕晕了。看题解的总结是这样:只要是涉及到要求二叉树的高度,那就必须要用到后序遍历,也就是先求左右子树的高度再去求根节点。
- 题解还有一种解法是迭代法,但觉得逻辑不太清晰,这里就不放了,有需要之后再会看吧。