该代码用于使用级别顺序遍历在二叉树中插入元素。我先告诉你它是如何工作的。它首先遍历每个级别中的节点,如果有任何节点没有两个子节点,则将该节点作为子节点插入该节点,并使用其队列来存储和检索节点地址。我的问题是每次调用create函数时,传递的根值总是为null,即使插入一个节点后根值不会改变,它仍然是null。我无法弄清楚这有什么问题。任何人都可以帮助我吗?
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *left,*right;
}*root;
struct queue
{
int capacity,rear,front;
struct node **qu;
};
void enqueue(struct queue *q,struct node *n)
{
q->front=(++(q->front))%q->capacity;
(q->qu)[q->front]=n;
if(q->rear==-1)
q->rear++;
}
struct node* dequeue(struct queue *q)
{
struct node *temp;
temp=q->qu[q->rear];
if(q->front==q->rear)
q->front=q->rear=-1;
else
q->rear=(++(q->rear))%q->capacity;
}
int isempty(struct queue *q)
{
return(q->rear==-1);
}
struct queue* create(unsigned int capacity)
{
struct queue *p;
p=(struct queue*)malloc(sizeof(struct queue));
p->capacity=capacity;
p->front=p->rear=-1;
p->qu=(struct node**)malloc(sizeof(struct node)*capacity);
return p;
}
void insert(struct node *root)
{
int n;
struct node *p,*q;
struct queue *tmp;
p=(struct node*)malloc(sizeof(struct node));
p->left=p->right=NULL;
scanf("%d",&n);
p->data=n;
if(root==NULL)
{
root=p;
return;
}
tmp=create(20);
enqueue(tmp,root);
while(isempty(tmp))
{
q=dequeue(tmp);
printf("%d %d\n",p,root);
if((!q->right)||(!q->left))
{
if(!q->right)
q->right=p;
else
q->left=p;
return;
}
else
{
enqueue(tmp,q->left);
enqueue(tmp,q->right);
}
}
}
void traverse(struct node *root)
{
if(!root)
return;
traverse(root->left);
printf("%d ",root->data);
traverse(root->right);
}
void main()
{
int i,n;
while(1)
{
printf("1.insert\n2.exit\n");
scanf("%d",&n);
switch(n)
{
case 2:goto end;
case 1:insert(root);
}
}
end:
traverse(root);
}
感谢。
答案 0 :(得分:1)
您已将root
定义为全局变量,但您的insert函数还定义了自己的root
本地版本,该版本优先。因为您通过值而不是引用传递root
,所以更改它的值无效。您有两种方法可以解决这个问题。
root
您将插入更改为void insert(struct node **root)
,然后将root
中的所有(*root)
实例替换为insert(&root)
。您还需要在调用root时将指针传递给root - root
struct node *
将返回类型更改为return root
,并确保root
在最后以及您已从该功能返回的任何位置。当您调用它时,您会将返回值指定为root=insert(root)
,如Collections.sort()
两者都是同等有效的选择。