二叉树--判断一棵树是否是完全二叉树

完全二叉树: 前n-1层都是满的,第n层如有空缺,则是缺在右边,即第n层的最右边的节点,它的左边是满的,右边是空的。

这里写图片描述

如何判断一个树是否为完全二叉树?
思路一:将所有的结点全部押入队列中,空也压入,每次判断队列的头如果队列头为空了则跳出循环,如果此后队列中还有元素则不是完全二叉树。

bool IsCompleteTree(BinaryTreeNode *pRoot)
{
         if(pRoot == NULL)
               return false;

          queue<BinaryTreeNode*> q;
          q.push(pRoot);
          BinaryTreeNode* pCur = q.front();
          while(pCur != NULL)
          {
               q.pop();
               q.push(pCur -> left);
               q.push(pCur -> right);
               pCur = q.front();
          }

          q.pop();//把空pop出来
          //因为以经有一个空了,所以只要头不为空就不是完全二叉树
          while(! q.empty())
          {
               if(q.front() != NULL)
                    return false;
               q.pop();
          }
          return true;
}

思路二:按照层序遍历二叉树,找到第一个只有非满结点(这个节点只有两种情况,孩子为空或者只有左没有右),如果之后的节点还有非满结点,则不是。

bool IsCompleteTree(BinaryTreeNode* pRoot)
{
     if(pRoot == NULL)
          return false;
     queue<BinaryTreeNode*>q;
     q.push(pRoot);
     //这里给一个flag是标记是否出现过满结点
     bool flag = false;

     while(!q.empty())
     {
          BinaryTreeNode* pCur = q.front();
          q.pop();
          //如果已经出现过满结点,则后面再出现有孩子的结点则一定不是完全二叉树。
          if(flag)
          {
               if(pCur ->left != NULL || pCur -> right != NULL)
                    return false;
          }
         else{
               if(pCur -> left != NULL && pCur -> right != NULL)
               {
                    q.push(pCur -> left);
                    q.push(pCur -> right);
               }
               else if(pCur -> left == NULL && pCur -> right != NULL)
                    return false;
               else if(pCur -> left != NULL && pCur -> right == NULL)
               {
                   q.push(pCur -> left);
                    flag = true;
              }
               else 
                    flag = true;
          }     
     }
     return true;
}
  • 15
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值