问题描述:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3 / \ 9 20 / \ 15 7
返回 true
。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1 / \ 2 2 / \ 3 3 / \ 4 4
返回 false
。
基本思路:
按照平衡二叉树的定义来好了:
- 空节点是平衡二叉树。
- 如果一个节点左右子树高度差不超过1,且左右子树均为平衡二叉树,那么该节点也是平衡二叉树。
对高度求递归,再对定义求递归,判断一下,就出来了。
要注意区别BST和平衡二叉树,这两个是完全不同的概念。
BST和平衡二叉树结合,形成的高度平衡的二叉搜索树,那就是一个崭新的世界。
高度平衡的二叉搜索树可以由AVl, RBT, Treap(区分于普通的树堆)和
AC代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int GetHeight(TreeNode *root) {
// 其实这里在求节点的个数了
// 处理特殊情况
if (!root) return 0;
// 获得左右子树高度
int left_height = 0;
int right_height = 0;
if (root->left) left_height = GetHeight(root->left);
if (root->right) right_height = GetHeight(root->right);
// 取最大的为深度
return max(left_height, right_height) + 1;
}
bool isBalanced(TreeNode* root) {
if (!root) return true;
int left_height = GetHeight(root->left);
int right_height = GetHeight(root->right);
// 不仅左右子树高度差为1, 而且左右子树必须都是平衡树
if (fabs(left_height - right_height) <= 1 && isBalanced(root->left) && isBalanced(root->right))
return true;
return false;
}
};
改进思路:
之前的代码在求深度和遍历平衡二叉树的过程中重复了。
不妨在求平衡二叉树的深度的时候引入一个flag,如果子树不是平衡二叉树就变为false;
这里是用了-1代替false;在返回合理的值时候做一个判断,然后继续把-1往上穿。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root == NULL)
return 0;
int left = maxDepth(root->left);
int right = maxDepth(root->right);
if(abs(left- right)>1 || left == -1 || right == -1)
return -1;
return max(left, right) + 1;
}
bool isBalanced(TreeNode* root) {
if(root == NULL)
return true;
return maxDepth(root) != -1;
}
};
其他经验:
在一个函数中其实完全可以把传值和判断一体化。
做法就是传一个不合法的值作为判断。
每次穿合法的值的时候判断一下是否合法,不合法的话继续传递不合法的值。