下图判断是否二叉树
假设图中三个二叉树的黄颜色部分没有,各树的名称就是图上所标。
首先由要求,需要层序遍历,层序遍历会使用到队列。
要判断一个二叉树是否为完全二叉树,首先需要找到临界点,比如此二叉树C结点。
- 如果C结点没有左右孩子,现在就要判断,B的左右孩子D和E,只要D和E至少一个有孩子,就不是完全二叉树。
- 如果C有左孩子,和1一样判断D和E是否有孩子,如果有,就不是完全二叉树。
如果C只有有孩子,那么就不是完全二叉树。
函数实现
int IscompleteBinTree(pBTNode pRoot)
{
Queue q;
//设置一个状态,当比如上图,当C没有孩子或者只有左孩子时,flag=1
//说明,当向下一层遍历是,如果下一层存在结点,则为不完全
//当有两个孩子时,flag=0,继续向遍历
int flag = 0;
if(NULL == pRoot)
return 1;
InitQueue(&q);
QueuePush(&q,pRoot);
while(!QueueEmpty(&q))
{
pBTNode pCur = Queuefront(&q);
if(flag)
{
if(pCur->_pLeft || pCur->_pRight)
return 0;
}
else
{
if(pCur->_pLeft && pCur->_pRight)
{
QueuePush(&q,pCur->_pLeft);
QueuePush(&q,pCur->_pRight);
flag = 0;
}
else if(pCur->_pLeft)
{
QueuePush(&q,pCur->_pLeft);
flag = 1;
}
else if(pCur->_pRight)
{
return 0;
}
else
flag = 1;
}
QueuePop(&q);
}
return 1;
}
测试
void test2()
{
char * pStr = "ABCDE#F";
int ret = 0;
pBTNode pRoot = NULL;
CreateBinTree(&pRoot,pStr,strlen(pStr),'#');
ret = IscompleteBinTree(pRoot);
if(1 == ret)
printf("这是一个完全二叉树!!!\n");
else if(0 == ret)
printf("这不是一个完全二叉树!!!\n");
}