判断是否完全二叉树
首先,完全二叉树是指若二叉树深度为h,第h-1层节点数都是最大个数,第h层所有节点都集中再最左边。
算法原理:按层次遍历二叉树,建立队列来保存节点。
如果队列不为空,从第一个根节点开始遍历。
1.如果节点没有子树,则判断左右子树节点是否为空,有则不是。
2.如果有子树,左右子树都不为空,则继续遍历。
左不空,右空,左子树压入队列,继续
若左空右不空,不是。
若左右都空,则是。
/**************************判断是不是完全二叉树****************************/
bool IsCompleteBinaryTree(BiTreeNode* &T)
{
if(T == NULL)return false;
queue<BiTreeNode*> q;//创建队列来存储节点
q.push(T);
bool mustHaveNoChild = false;
bool result = true;
while(!q.empty())//如果队列不为空
{
BiTreeNode* pNode = q.front();//队列头结点为指针
q.pop();//把头结点出列
if(mustHaveNoChild)//如果该节点没有子树
{
if(pNode->lchild != NULL || pNode->rchild != NULL)
{
result = false;//如果左子树或右子树不为空,则不是完全二叉树
break;
}
}
else//如果该节点有子树
{
if(pNode->lchild != NULL && pNode->rchild != NULL)//左右子树都不为空
{
q.push(pNode->lchild);
q.push(pNode->rchild);
}
else if(pNode->lchild != NULL && pNode->rchild == NULL)//左子树不为空,右子树为空
{
mustHaveNoChild = true;
q.push(pNode->lchild);
}
else if(pNode->lchild == NULL && pNode->rchild != NULL)//左子树为空,右子树不为空
{
result = false;
break;
}
else//左右子树都为空
{
mustHaveNoChild = true;
}
}
}
return result;
}