三:求二叉树的深度以及判断二叉树是否平衡

求树的深度

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); 

}  

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