题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
方法一:直接求树的高度
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
if(pRoot==NULL)
return true;;
int L=HigthTree(pRoot->left);
int R=HigthTree(pRoot->right);
if(abs(L-R)>1)
return false;
else
return IsBalanced_Solution(pRoot->left)&&IsBalanced_Solution(pRoot->right);
}
int HigthTree(TreeNode* tree) //求树的高度
{
int r, l, m;
if (tree == NULL)
return 0;
l = HigthTree(tree->left); //求左子树的深度
r = HigthTree(tree->right); //求右子树的深度
m = (l > r) ? l : r; //取左右子树较大的深度
return (1 +m);
}
};
方法二
后续遍历,遍历到一个节点,其左右子树已经遍历 依次自底向上判断,每个节点只需要遍历一次。
设置一个标记位,当某子树不是平衡二叉树时,设置标记位。
class Solution {
public:
int flag=0;
bool IsBalanced_Solution(TreeNode* pRoot) {
HigthTree(pRoot);
return flag!=-1;
}
int HigthTree(TreeNode* tree) //求树的高度
{
int r, l;
if (tree == NULL)
return 0;
l = HigthTree(tree->left); //求左子树的深度
r = HigthTree(tree->right); //求右子树的深度
if(abs(l-r)>1)
flag=-1;;
return (l > r) ? 1+l : 1+r; //取左右子树较大的深度
}
};
注意:这里使找到非平衡二叉树时让HigthTree函数返回-1,通过判断HigthTree函数返回值来判断是否是平衡二叉树。因为HigthTree函数return之后,并没有退出函数,该返回值可能又参与了下一次的递归计算。