原理
从二叉树的根层序遍历直到遍历到第一个NULL,然后继续遍历,如果还有结点则该树不是完全二叉树。
实现代码
1、第一种
bool _IsEntireTree(BinaryTreeNode<T>* pRoot)
{
if (pRoot == NULL)
return true;
queue<BinaryTreeNode<T>* > q;
q.push(pRoot);
//遍历链表直到NULL结点,该循环退出,则已经标记了一个NULL
while (q.front())
{
BinaryTreeNode<T>* pFront = q.front();
q.push(pFront->_pLeft);
q.push(pFront->_pRight);
q.pop();
}
while (!q.empty())//队列不为空
{
if (q.front() != NULL)//队列头节点还不为空,则不是完全二叉树
return false;
q.pop();
}
return true;
}
2、第二种
bool _IsEntireTree(BinaryTreeNode<T>* pRoot)
{
if (pRoot == NULL)
return true;
if (pRoot->_pLeft == NULL && pRoot->_pRight == NULL)
return true;
queue<BinaryTreeNode<T>* > q;
q.push(pRoot);
bool flag = false;//用来标记队列中的NULL
while (!q.empty())
{
BinaryTreeNode<T>* pTemp = q.front();
if (pTemp != NULL)
{
if (flag)//队列不为空且队列中第二次出现NULL,则该二叉树不是完全二叉树
return false;
q.push(pTemp->_pLeft);
q.push(pTemp->_pRight);
}
else
flag = true;//当队列中出现一次NULL标记一次
q.pop();
}
return true;
}