关闭

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

标签: 二叉树的深度判断二叉树是否平衡判断平衡二叉树
349人阅读 评论(0) 收藏 举报
分类:

求树的深度

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

}  

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12416次
    • 积分:390
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章存档