求树的深度
int TreeDepth(BinaryTreeNode* pRoot)
{
if (pRoot == NULL)
return 0;
int nLeftDepth = TreeDepth(pRoot->m_pLeft);
int nRightDepth = TreeDepth(pRoot->m_pRight);
return(nLeftDepth>nRightDepth)?(nLeftDepth+1):(nRightDepth+1);
}
判断是否为平衡二叉树
方法一:
bool IsBalanced(BinaryTreeNode* pRoot)
{
if(pRoot== NULL)
return true;
int nLeftDepth = TreeDepth(pRoot->m_pLeft);
int nRightDepth = TreeDepth(pRoot->m_pRight);
int diff = nRightDepth-nLeftDepth;
if (diff>1 || diff<-1)
return false;
returnIsBalanced(pRoot->m_pLeft)&&IsBalanced(pRoot->m_pRight);
}
方法二:
由于上述方法在求该结点的的左右子树深度时遍历一遍树,再次判断子树的平衡性时又遍历一遍树结构,造成遍历多次。如果我们用后序遍历的方式遍历二叉树的每一个结点,在遍历到一个结点之前我们已经遍历了它的左右子树。只要在遍历每个结点的时候记录它的深度(某一结点的深度等于它到叶节点的路径的长度),我们就可以一边遍历一边判断每个结点是不是平衡的。
bool IsBalanced(BinaryTreeNode* pRoot, int*depth)
{
if(pRoot==NULL)
{
*depth =0;
returntrue;
}
int nLeftDepth,nRightDepth;
bool bLeft=IsBalanced(pRoot->m_pLeft, &nLeftDepth);
bool bRight= IsBalanced(pRoot->m_pRight, &nRightDepth);
if (bLeft&& bRight)
{
int diff= nRightDepth-nLeftDepth;
if(diff<=1 || diff>=-1)
{
*depth = 1+(nLeftDepth > nRightDepth ? nLeftDepth :nRightDepth);
return true;
}
}
returnfalse;
}
bool CallIsBalanced(BinaryTreeNode* pRoot)
{
int depth =0;
returnIsBalanced(pRoot, &depth);
}