执行levelOrder函数时,我无法弄清楚异常终止的原因吗?

时间:2019-06-05 11:00:58

标签: c++ queue binary-tree

此代码用于实现二进制树。 它由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;
}

1 个答案:

答案 0 :(得分:1)

从队列中弹出最后一个元素后,如果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();
}

顺便提一下,在这种情况下,“局部循环”变量可以提高可读性-所有这些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);
}