描述:给定一个二叉树,确定它是高度平衡的。对于这个问题,一棵高度平衡的二叉树的定义是:一棵二叉树中每个节点的两个子树的深度相差不会超过1。
例题1:
输入:
tree = {1,2,3}
输出:
true
解释:
如下,是一个平衡的二叉树。
1
/ \
2 3
例题2:
输入:
tree = {1,#,2,3,4}
输出:
false
解释:
如下,是一个不平衡的二叉树。1的左右子树高度差2
1
\
2
/ \
3 4
**
递归解法:
**
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: The root of binary tree.
* @return: True if this Binary tree is Balanced, or false.
*/
// max(left,right)+1 这个需要好好理解,
// 实际上最后一层的节点(不为空那个)高度为1,倒数第二节点为2,倒数第三节点高度为3,这样回溯,
// 当然对于一个节点,需要取其左右子树中较大的那个对应的值,然后+1,
// 因为这个节点比它的左右子树高了一层;我的表达可能不太顺畅;
//判断当前节点(如根的左子树)的高度,然后和它同一个根节点的另一个节点(如根的右子树)的高度比较;
// 将较大的那个节点代表的高度+1,回溯作为上一个节点的高度;
int Height(TreeNode *root)
{
if(root==NULL)
{
return 0;
}
int left=Height(root->left);
int right=Height(root->right);
return max(left,right)+1;
}
bool isBalanced(TreeNode *root) {
// write your code here
if(root==NULL)
{
return true;
}
//当前节点的左右子树高度;当然要用到Height递归函数才知道这两个子树的高度值;
int left = Height(root->left);
int right = Height(root->right);
// 如果这个节点的左右子树高度值大于1,则不平衡;
if(abs(left-right)>1)
{
return false;
}
//递归下去分别判断左子树和右子树,注意是&&,也就是只要存在一个节点不是平衡二叉树就返回false;
return isBalanced(root->left) && isBalanced(root->right);
}
};
图片参考:
图1:注意里面是数字代表当前节点的高度,而不是树的值;
图2:
图3:
另一种递归思路:
//判断是否为平衡二叉树
bool isBalanced(TreeNode *root)
{
return height(root)>=0;
}
//返回最大高度,返回-1表明树不平衡
int height(TreeNode *root)
{
if(root==NULL)
return 0;
int left=height(root->left);
int right=height(root->right);
//只要有一个子树节点<0(不平衡),则返回-1;
if(left<0 || right <0)
{
return -1;
}
if(left==right)
{
return left+1; //left==right,所以return right+1;也可以
}
//以下就是判断两个节点是否平衡,高度差大于1则不平衡,直接返回-1;
//否则就返回较高的那个子树高度+1的值;毕竟根节点的高度比你这个子树要高一层;
else if(left>right)
{
if(left-right>1)
return -1;
return left+1;
}
else
{
if(right-left>1)
return -1;
return right+1;
}
}