二叉树的深度以及判断二叉树是否为平衡二叉树

二叉树的深度

题目:
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

基本思想:
我们假定Tree的节点个数为GetTreeNodeNum(),其左子树为LeftTree,右子树为RightTree。那么求Tree的深度有以下几种情况:

  1. GetTreeNodeNum()==1&&LeftTree==NULL&&RightTree==NULL 则Tree的深度depth=1.
  2. GetTreeNodeNum()>1&&LeftTree!=NULL&&RightTree==NULL 则Tree的深度depth=GetDepth(LeftTree)+1.
  3. GetTreeNodeNum()>1&&LeftTree==NULL&&RightTree!=NULL 则Tree的深度depth=GetDepth(RightTree)+1.
  4. GetTreeNodeNum()>1&&LeftTree!=NULL&&RightTree!=NULL 则Tree的深度depth= Max(GetDepth(RightTree),GetDepth(LeftTree))+1.

综上,代码如下:

//递归版本
int TreeDepth(TreeNode* pRoot)
{

    if(pRoot==NULL) return 0;

      int nLeft=TreeDepth(pRoot->left);
      int nRight=TreeDepth(pRoot->right);

      return (nLeft>nRight)?nLeft+1:nRight+1;
  }
  //非递归版本
   int TreeDepth(TreeNode* pRoot)
      {

          if(pRoot==NULL) return 0;
          queue<TreeNode *> q;
          q.push(pRoot);
          int depth=0;
          while(!q.empty()){
              int len=q.size();
              depth++;
              while(len--){
                  TreeNode *tmp=q.front();
                  q.pop();
                  if(tmp->left) q.push(tmp->left);
                  if(tmp->right) q.push(tmp->right);
              }
          }
          return depth;
     }

树是否为平衡二叉树

题目:

输入一棵二叉树,判断该二叉树是否是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一颗平衡二叉树。

解法1:

有了求二叉树的深度的代码之后,我们知道求解一个树是否为平衡二叉树,其实就是在遍历每一个节点的时候,判断其左右子树的深度的差值是否超过1,如果每个节点都满足平衡的条件,则返回true。代码如下:

bool isBalanced(TreeNode *pRoot){
    if(pRoot==NULL)
        return true;
    int left=TreeDepth(pRoot->left);
    int right=TreeDepth(pRoot->right);
    int dif=left-right;
    if(dif>1||dif<-1)
        return false;
    return isBalanced(pRoot->left)&&isBalanced(pRoot->right);
}

解法2

解法1存在着重复遍历节点多次的缺陷。例如在判断根节点是否是平衡的时候,会依次遍历左右子树一遍。如果平衡,继续遍历根节点左右子树的时候,又会重复遍历在判断根节点平衡时遍历过的节点。故我们可以改用后序遍历的方式来遍历二叉树的每一个节点,这样在遍历一个节点的时候,我们已经遍历了其左右子树,那么我们可以在遍历左右子树的时候记录其结点的深度,那么我们可以一边遍历一边判断每个节点是否是平衡的。

代码如下:

bool IsBalanced_Solution(TreeNode* pRoot) {

        int depth=0;
        return IsBanlanced(pRoot,&depth);

    }
    bool IsBanlanced(TreeNode* pRoot, int* pDepth)
    {
        if(pRoot==NULL)
        {
            *pDepth=0;
            return true;
        }

        int left,right;

        if(IsBanlanced(pRoot->left,&left)&&IsBanlanced(pRoot->right,&right))
        {
            int diff=left-right;
            if(diff<=1&&diff>=-1)
            {
                *pDepth=1+(left>right?left:right);
                return true;
            }
        }
        return false;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值