/***/二叉树经典面试题之判断一棵二叉树是否是完全二叉树

来源:互联网 发布:南天软件待遇 编辑:程序博客网 时间:2024/06/05 15:36

什么是完全二叉树呢
如果一颗二叉树的只有最后两层结点的度能小于2,其余结点的度都等于2。且最后一层的结点从最左边依次排列。 如果一颗二叉树中的每一个结点都与编号从1到n的满二叉树中的结点一一对应,则称这棵二叉树为完全二叉树。
我们可以根据完全二叉树的定义,按照层序遍历一颗树,当遇到空结点时如果这棵树已经遍历完毕,则这棵树就是完全二叉树,如果遇到空结点的后面还有元素则这棵树就不是完全二叉树。
我们可以用一个flag来标记,当遇到第一个空结点是标记为1,如果后面要是再遇到非空结点时就表示不是完全二叉树。

bool IsCompleteBinaryTree(BinaryTreeNode<int>* root)  //判断一颗二叉树是否是完全二叉树  {      if (root == NULL)          return false;      queue<BinaryTreeNode<int>*> q;      int flag = 0;      q.push(root);      while (!q.empty())      {          BinaryTreeNode<int>* cur = q.front();          q.pop();          if (cur->_left)          {              if (flag)                  return false;              q.push(cur->_left);          }          else          {              if (flag == 0)                  flag = 1;          }          if (cur->_right)          {              if (flag)                  return false;              q.push(cur->_right);          }          else          {              if (flag == 0)                  flag = 1;          }      }      return true;  }  

分析如图所示

判断一棵树是否为完全二叉树,首先要理解完全二叉树的定义,完全二叉树就是 只有最下面的两层结点度能够小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。

1)所以根据特点,我们可以思考,如果对于完全二叉树,我们进行层序遍历,那么一直就可以走到头,而对于非完全二叉树,我们进行层序遍历,那么我们可能还会遇到空。因为最后一层节点的分布导致。

所以我们就可以利用层序遍历进行判断,先把每层的节点进行入队。然后出队,一直到碰到NULL,这个时候看队中是否还剩下了非空结点,如果存在,那么就不是完全二叉树。如果不存在,那么就是完全二叉树。

2)可以给一个flag,当到左树的时候,利用这个flag,如果左为空,右边还右节点,那么这棵树必定不是完全二叉树。

3)也还可以从上利用队列,放入队列当中,当遇到一个空节点后不再入队,然后向后看是否还有非空节点,有则不是完全二叉树,没有则是完全二叉树。

bool IsComplateBinaryTree()    {        std::queue<Node * > q;        Node* cur = _root;        q.push(cur);        //首先进行层序,把每一层的节点都入队,这个时候不存在的节点就按照NULL入队        while ((cur = q.front()) != NULL)        {            q.pop();            q.push(cur->_left);            q.push(cur->_right);        }        //这个时候如果是完全二叉树,那么队中就全部为空,如果为非完全二叉树的话,那么队中就会存在不为空的元素。        while (!q.empty())        {            cur = q.front();            q.pop();            if (cur != NULL)            {                return false;            }        }        return true;

这里写图片描述
这里写图片描述

0 0
原创粉丝点击