本文最后更新于:2020年7月1日 晚上

题目描述:

输入一棵二叉树,判断该二叉树是否是平衡二叉树。

实现如下:

//如果二叉树中的任意结点的左右子树的深度相差不超过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);//开始递归,进行后序遍历
	}
};