注意,空树也是完全二叉树
思想就是层序遍历所有的结点,如果遍历到一个空结点,再继续遍历,如果遇到了一个非空结点即代表非完全二叉树。(完全二叉树的性质决定了空结点只能连续存在而不能存在两个非空结点之间)。
具体过程就是设置一个bool变量flag,默认为false,当遇到第一个空结点时,设置为true。每当遇到一个非空结点,则先判断flag是否为true,如果是true直接输出非完全二叉树,结束程序。
struct node
{
node *lchild,*rchild;
};
bool judge(node *root)
{
std::queue<node*> q;
if(root!=NULL)
{
q.push(root);
bool flag=false;
while(!q.empty())
{
node *temp=new node;
temp=q.front();
q.pop();
if(temp!=NULL)
{
if(flag==true) return false;
else
{
q.push(temp->lchild);
q.push(temp->rchild);
}
}
else flag=true;
}
return true;
}
else if(root==NULL) return true;//空树也是完全二叉树
}