通过建立一个栈,且设一个判断节点是否为满的变量,先将根节点进栈,将Stack[top]出栈并定义一个current结点来暂存,如果有非满结点且非满结点有子节点则不是完全二叉树,有右孩子无左孩子判断不是完全二叉树,再将current的子节点入栈,注意顺序先右后左,这样出栈的时候是先左后右。判断是否有非满的结点,有则将标记变量置为true。
#include"BiTree.h"
//使用栈来判断二叉树是否是完全二叉树
bool isCompleteTree(BTNode* T)
{
if (T == NULL)
{
return false;
}
BTNode* Stack[MAXSIZE];
int top = -1;
Stack[++top] = T;
bool NotFullNodeFound = false;//标记是否找到非满的结点,一开始先置为false
while (top >= 0)
{
BTNode* current = Stack[top--];
if (NotFullNodeFound)
{
if (current->lchild || current->rchild)//如果非满结点有子节点则不是完全二叉树
{
return false;
}
}
else
{
if (current->rchild && !current->lchild)//有右孩子无左孩子判断不是完全二叉树return false
{
return false;
}
}
//将子节点入栈,注意顺序先右后左,这样出栈的时候是先左后右
if (current->rchild)
{
Stack[++top] = current->rchild;
}
if (current->lchild)
{
Stack[++top] = current->lchild;
}
//判断是否有非满的结点,有则将标记变量置为true
if ((current->lchild && !current->rchild)||(!current->lchild)&&(!current->rchild))
{
NotFullNodeFound = true;
}
}
return true;
}
int main(int argc, char* argv[])
{
BTNode* T;
InitBiTree(T);
char str[] = "1(2, 3(4(6), 5))";// 1(2, 3)"//"1(2, 3(4(6), 5))"
CreateBiTree(T, str);
PrintBiTree(T, 0);
if (isCompleteTree(T))
{
printf("该二叉树是完全二叉树\n");
}
else
{
printf("该二叉树不是完全二叉树\n");
}
DestroyBiTree(T);
return 0;
}