思想一:在求树深度的基础下,对每个节点的左右子树求深度,按照定义,左右子树的深度差不超过1就是平衡二叉树。
缺点:需要重复遍历
//求树的深度
int TreeDepth(BinaryTreeNode* pRoot)
{
if(pRoot == NULL)
return 0;
int nletf=TreeDepth(pRoot->m_pLeft);
int nright=TreeDepth(pRoot->pRight);
return (nleft > nright)? (nleft + 1) :(nright + 1);
}
//判断是不是平衡二叉树
bool IsBalanced(BinaryTreeNode* pRoot)
{
if(pRoot ==NULL)
return true;
int left=TreeDepth(pRoot->m_pleft);
int right=TreeDepth(pRoot->m_pright);
int diff=left-right;
if(diff>1||diff<-1)
return false;
return IsBalanced(pRoot->m-pleft)&&IsBalanced(pRoot->m_pright);
}
思想二:如果我们用后序遍历的方式遍历二叉树的每一个节点,在遍历到一个节点之前我们就已经遍历了它的左右子树,只要在遍历每个节点的时候记录它的深度,我们就可以一边遍历一边判断没个节点是不是平衡的。
bool IsBalanced(BinaryTreeNode* pRoot,int *pDepth)
{
if(pRoot==NULL)
{
*pDepth=0;
return true;
}
int left,right;
if(IsBalanced(pRoot->m_pLeft,&left)&&(IsBalanced(pRoot->m_pRight))
{
int diff=left-right;
if(diff<=1&&diff>=-1)
{
*pDepth=1+(left > right ? left: right);
return true;
}
}
return false;
}
bool IsBalanced(BinaryTreeNode* pRoot)
{
int depth=0;
return IsBalanced(pRoot, &depth);
}
在上面代码中,我们用后序遍历的方式遍历整颗二叉树。在遍历某节点的左右子节点之后,我们根据他的左右子节点的深度判断他是否平衡,并得到当前节点的深度。当我们遍历到根节点的时候,也就判断了整颗二叉树是不是平衡二叉树。