在二叉树中插入元素

时间:2017-03-15 15:42:02

标签: c data-structures

该代码用于使用级别顺序遍历在二叉树中插入元素。我先告诉你它是如何工作的。它首先遍历每个级别中的节点,如果有任何节点没有两个子节点,则将该节点作为子节点插入该节点,并使用其队列来存储和检索节点地址。我的问题是每次调用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);
 }

感谢。

1 个答案:

答案 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()

两者都是同等有效的选择。