推断二叉树是不是平衡二叉树

题目:输入一棵二叉树的根结点,推断该树是不是平衡二叉树。

某二叉树中随意结点的左右子树的深度相差不超过1。那么它就是一棵二叉树。
        我们非常easy就能想到一个代码简洁却性能不佳的思路:在遍历树的每一个结点的时候,调用函数TreeDpth得到它的左右子树的深度。

假设每一个结点的左右子树的深度相差都不超过1。依照定义它就是一棵平衡的二又树。

        较好的思路是:用后序遍历的方式遍历整棵二叉树。

在遍历某结点的左右子结点之后,我们能够依据它的左右子结点的深度推断它是不是平衡的,并得到当前结点的深度。

当最后遍历到树的根结点的时候,也就推断了整棵一几叉树是不是平衡一叉树。这样的方案每一个结点仅仅需遍历一次。

struct BinaryTreeNode{
	int m_nValue;
	BinaryTreeNode *m_pLeft;
	BinaryTreeNode *m_pRight;
};
bool IsBalanced(BinaryTreeNode *pRoot, int *depth)
{
	if (pRoot==NULL)
	{
		*depth=0;
		return true;
	}
	//中间变量,记录左右子树的深度
	int left,right;
	if (IsBalanced(pRoot->m_pLeft,&left)&&IsBalanced(pRoot->m_pRight,&right))
	{
		//深度差
		int Dif=left-right;
		if (Dif<=1&&Dif>=-1)
		{
			*depth=1+(left>right?left:right);
			return true;
		}
	}
	return false;
}

//推断是否是平衡二叉树
bool IsBalanced(BinaryTreeNode *pRoot)
{
	int depth=0;
	return IsBalanced(pRoot,&depth);
}


posted @ 2016-03-25 13:12  phlsheji  阅读(227)  评论(0编辑  收藏  举报