题目描述
- 输入一棵二叉树,判断该二叉树是否是平衡二叉树。
- 平衡二叉树:即左右子树的高度差不超过1
- 如下图所示:
- 如上图所示:(a)树左右子树的高度均为3,高度差为0<1,所以平衡;(b)树左右子树的高度分别为3和2,高度差为1<=1,所以平衡;(c)树左右子树的高度差分别为3和1,高度差2>1,所以不平衡
- 注意:我们所说的平衡二叉树,即这棵树每一颗子树都是平衡二叉树
- 二叉树节点定义如下:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
解题思路
- 既然平衡二叉树的判定和树的高度有关,那么我们首先要会求树的高度,大家可以点这里二叉树的深度查看我的博文,这里不再详述
- 如果我们求得左右子树的高度,那么可以通过计算左右子树高度的绝对值来进行判断,若大于1,直接返回false;否则返回true
- 上面这种思路,我们用一个全局变量来标记当前子树是否是平衡二叉树,但是若是判断为不是并没有直接返回,而是一直遍历完整棵树,整合这个标记,然后返回,这样若是递归的最深层子树就不平衡,那么后面的判断都是没有必要的
- 所以,我们应该向办法让从下向上遍历过程中,若有子树不平衡,则直接返回,这样可以建少不必要的开销
- 思路理清楚之后,我们就可以写代码了
代码实现
bool isBalance = true;
int TreeDepth(TreeNode* pRoot)
{
if(pRoot == NULL)
return 0;
int left = TreeDepth(pRoot->left);
int right = TreeDepth(pRoot->right);
if(abs(left - right) > 1)
isBalance = false;
return left > right ? left+1 : right+1;
}
bool IsBalanced_Solution(TreeNode* pRoot)
{
TreeDepth(pRoot);
return isBalance;
}
int TreeDepth(TreeNode* pRoot)
{
if (pRoot == NULL)
return 0;
int left = TreeDepth(pRoot->left);
if (left == -1)
return -1;
int right = TreeDepth(pRoot->right);
if (right == -1)
return -1;
return abs(left - right) > 1 ? -1 : max(left, right) + 1;
}
bool IsBalanced_Solution(TreeNode* pRoot)
{
return TreeDepth(pRoot) != -1;
}