完全二叉树
该节点有左子树,可以没有有子树,但如果有右子树,就必须有左子树
这里我们可以用层序遍历的思想,借助一个队列,队列保存的是Node*,将该节点入队列,出队列的同时将下一层自己的左右节点入队列,设置一个标志位,刚开始位true,如果此时左右节点为空时,置为false,第一次为false,当第二次进来时,将该节点入队列后,判断下flag,此时flag为false,说明该层的上一个节点为空,而此时也就是相对写一个节点不为空,则说明不是完全二叉树
bool IsCompleteTree()//判断是否为完全二叉树
{
if (_root == NULL)
//为空树,直接返回true
{
return true;
}
queue<Node*> q;
q.push(_root);
bool flag = true;
while (!q.empty())
{
Node* front = q.front();
q.pop();
if (front->_left)
{
q.push(front->_left);
if (flag == false)
{
return false;
//此时前面已经有一个节点为空了,这个节点不为空,说明不是完全二叉树
}
}
else
{
flag = false;
}
if (front->_right)
{
q.push(front->_right);
if (flag == false)
{
return false;
}
}
else
{
flag = false;
}
}
return true;
}