满二叉树:在一棵二叉树中,所有分支结点都存在左、右子树,并且所有叶子节点都在同一层上。
完全二叉树:与满二叉树的前N个结点的结构相同的二叉树。
如何判断一个一棵树是不是完全二叉树呢?
采用广度优先遍历,从根节点开始,入队列,如果队列不为空,循环。遇到第一个没有左孩子或者右孩子的节点,设置标志位,如果之后再遇到有左孩子或右孩子的节点,那么这不是一颗完全二叉树。
具体实现:
bool CompleteBinaryTree(BinaryTreeNode<T>* _pRoot)
{
if (_pRoot == NULL)//空树属于完全二叉树
return false;
queue<BinaryTreeNode<T>*> q;
bool flag = false;//标记不满的结点(只有左孩子或左右孩子都没有),不满:True,若下一个结点有左或右孩子,则不是完全二叉树
q.push(_pRoot);
while (!q.empty())
{
BinaryTreeNode<T> *pCur = q.front();
if (!flag)
{
if (pCur->_pLeftChild && pCur->_pRightChild)
{
q.push(pCur->_pLeftChild);
q.push(pCur->_pRightChild);
}
else if (pCur->_pLeftChild)//当前节点有左孩子,不是满节点
{
q.push(pCur->_pLeftChild);
flag = true;
}
else if (pCur->_pRightChild)//当前节点只有右孩子,肯定不是完全二叉树
return false;
else
flag = true; //当前节点无孩子,不是满节点
}
else
{
if (pCur->_pLeftChild || pCur->_pRightChild)
return false;
}
q.pop();
}
return true;
}