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

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

原创 2017年07月27日 19:16:05
  • 472

完全二叉树: 前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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

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

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;
}
阅读更多
个人分类: 算法
上一篇总结深度优先与广度优先的区别
下一篇Yii2中的代码自动加载机制
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭