二叉树:
1.满二叉树:在一棵二叉树中,如果所有分支节点都存在左子树和右子树,并且所有叶子节点都在同一层上。
2.完全二叉树:如果一棵具有N个结点的二叉树的结构与满二叉树的前N个结点的结构相同,称为完全二叉树。
//判断一棵二叉树是否是完全二叉树--利用层序遍历来处理->关键:找第一个度不为2的结点->后序结点:如果有孩子则不是完全二叉树,否则是
bool IsCompleteBinaryTree()
{
if (NULL == _pRoot) //
return false;
bool isOnlyLeft = false; //标记仅有左节点的结点
queue<Node*> q;
q.push(_pRoot);
while (!q.empty())
{
Node* pCur = q.front();
q.pop();
if (isOnlyLeft)
{
if (pCur->_pLeft || pCur->_pRight)
return false;
}
else
{
if (NULL == pCur->_pLeft && NULL != pCur->_pRight) //存在右孩子没有左孩子,一定不为完全二叉树
return false;
else if (NULL != pCur->_pLeft && NULL == pCur->_pRight) //存在左孩子没有右孩子可能不是,记录标记结点看后续结点
{
q.push(pCur->_pLeft);
isOnlyLeft = true; //只有左孩子是非满结点
}
else if (NULL != pCur->_pLeft && NULL != pCur->_pRight) // 左右孩子都存在,入队列继续循环判断
{
q.push(pCur->_pLeft);
q.push(pCur->_pRight);
}
else
isOnlyLeft = true; //左右孩子都存在,为非满结点,看后续结点
}
}
return true;
}
判断一棵树是否是完全二叉树