执行levelOrder函数时一直想不通异常终止的原因?

I can't figure out the reason for abnormal termination while executing levelOrder function?

此代码用于实现二叉树。 它由insertNode(在树中插入节点的函数)和levelOrder(按级别顺序遍历二叉树的函数)组成。

insertNode 函数工作正常,但在执行 levelOrder 时它成功显示数据,但之后它停止工作并显示程序已停止工作。

我找不到哪里出错了? 提前致谢{ : )

#include<iostream>
using namespace std;

struct Node
{
    Node *left;
    Node *right;
    int data;
}*root;

struct Queue
{

    Node *p[1000];
    int index=-1;

    Node *add(Node *ptr)
    {
        p[++index]=ptr;
        return ptr;
    }
    Node *peek()
    {
        if(index==-1)
            return NULL;

        return p[0];    
    }
    Node *pop()
    {
        if(index==-1)
            return NULL;

        Node *temp=p[0];

        for(int i=0;i<index;i++)
            p[i]=p[i+1];

        index--;

        return temp;

    }
};

Node * createNode(int data)
{
    Node *p=new Node();
    p->data=data;
    p->left=p->right=NULL;

    return p;
}

///////Insertion Of Node////////

int insertNode(int val)
{
    if(root==NULL)
    {
        root=createNode(val);
        return val;
    }

    bool found=false;
    Node *p;

    Queue q;
    q.add(root);
    while(found==false)
    {
        Node *l=(q.peek())->left;
        Node *r=(q.peek())->right;

        if(l==NULL)
        {
            (q.peek())->left=createNode(val);
            found=true;
            return val;
        }
        else
            q.add(l);

        if(r==NULL)
        {
            q.peek()->right=createNode(val);
            found=true;
            return val;
        }
        else
            q.add(r);


        q.pop();

    }
        return val;

}
/////////Traversal's///////////
void levelOrder(Node *p)
{
    if(p==NULL)
        return;

    Queue q;
    q.add(p);

    while(true)
    {
        cout<<q.peek()->data<<" ";

        if(q.peek()->left!=NULL)
            q.add(q.peek()->left);

        if(q.peek()->right!=NULL)
            q.add(q.peek()->right);

        if(q.pop()==NULL)
            return;
    }

}


int main()
{
    root=NULL;

    insertNode(1);
    insertNode(2);
    insertNode(3);
    insertNode(4);

    levelOrder(root);


    return 0;
}

从队列中弹出最后一个元素后,在下一次迭代中 q.peek()->data,此时 q.peek() 不是有效指针。

更改终止条件:

while (q.peek())
{
    cout<<q.peek()->data<<" "<< endl;;

    if(q.peek()->left!=NULL)
        q.add(q.peek()->left);

    if(q.peek()->right!=NULL)
        q.add(q.peek()->right);

    q.pop();
}

附带说明一下,这是 "loop-local" 变量可以提高可读性的一种情况 - 所有这些 peek 都会增加混乱:

while(Node *next = q.pop())
{
    cout<<next->data<<" "<< endl;;

    if(next->left != nullptr)
        q.add(next->left);

    if(next->right != nullptr)
        q.add(next->right);
}