题目描述:
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
实现如下:
//如果二叉树中的任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树
//利用对二叉树的后序遍历,自底向上的判断是否为平衡二叉树
//若某一结点不满足条件,则此树不是平衡二叉树
//若某一结点满足条件,就要计算此结点的深度,为后面的计算做准备
class Solution
{
public:
bool IsBalanced(TreeNode* pRoot, int &depth)
{
if (pRoot == NULL)
{
depth = 0;
return true;
}
int leftChildDepth = 0;//记录当前结点的左子树深度
int rightChildDepth = 0;//记录当前结点的右子树深度
//如果当前结点的左右子树都满足平衡时
if (IsBalanced(pRoot->left, leftChildDepth) && IsBalanced(pRoot->right, rightChildDepth))
{
int high = leftChildDepth - rightChildDepth;//计算当前结点的左右高度差
if (high >= -1 && high <= 1)//如果依旧平衡
{
depth = 1 + (leftChildDepth >= rightChildDepth ? leftChildDepth : rightChildDepth);//计算此结点的深度
return true;
}
}
return false;//此时此结点不满足平衡条件
}
bool IsBalanced_Solution(TreeNode* pRoot)
{
int depth = 0;//记录每一个结点的深度
return IsBalanced(pRoot, depth);//开始递归,进行后序遍历
}
};