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

求树的深度

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值