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