面试题39_2 判断一棵树是不是平衡二叉树

思想一:在求树深度的基础下,对每个节点的左右子树求深度,按照定义,左右子树的深度差不超过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);

 在上面代码中,我们用后序遍历的方式遍历整颗二叉树。在遍历某节点的左右子节点之后,我们根据他的左右子节点的深度判断他是否平衡,并得到当前节点的深度。当我们遍历到根节点的时候,也就判断了整颗二叉树是不是平衡二叉树。

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/qyh791414379/article/details/45872859
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞