给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过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 。
思路:根据平衡二叉树的定义,递归求左右子树是否是平衡二叉树即可。递归思路三步走,第一步:判断递归终止的条件是啥,第二步递归的参数传啥 第三步……
判断如果左右子树不是平衡二叉树,返回false,如果是判断这棵树的高度差是否是平衡二叉树。
C++代码如下:
/**
* 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 high(TreeNode* root)
{
int res=0;
if(root)
{
res=max(high(root->left),high(root->right))+1;
}
return res;
}
bool isBalanced(TreeNode* root) {
if(!root) return true;
if(!root->left && !root->right) return true;
if(isBalanced(root->left) && isBalanced(root->right))
{
int lh=high(root->left);
int rh=high(root->right);
if(abs(lh-rh) <=1)
return true;
else
return false;
}
return false;
}
};
不过上面的方法有个明显的问题,就是递归重复太多了,重复计算很多次子树的高度。有点浪费
所以有下面的方法:
方法是如果我们发现子树不平衡,则不计算具体的深度,而是直接返回-1。那么优化后的方法为:对于每一个节点,我们通过方法递归获得左右子树的深度,如果子树是平衡的,则返回真实的深度,若不平衡,直接返回-1,此方法时间复杂度O(N),空间复杂度O(H),参见代码如下:空间和时间复杂度不是很会算。
/**
* 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 Depth(TreeNode* root) {
if(!root) return 0;
if(!root->left && !root->right) return 1;
int left=Depth(root->left);
if(left == -1) return -1;
int right=Depth(root->right);
if(right == -1) return -1;
int diff=abs(left-right);
if(diff > 1)
return -1;
else
return max(left,right)+1;
}
bool isBalanced(TreeNode* root) {
if(!root) return true;
if(Depth(root) == -1) return false;
else
return true;
}
};
参考: