创建二叉树但它不起作用 - 树总是为空

时间:2014-03-16 05:46:55

标签: c data-structures binary-search-tree

我正在创建一个代码以在树中插入元素,但tinsert函数不插入;我的代码出了什么问题?我已经检查了很多次但是树总是为NULL。

代码只有两个函数:一个用于插入,第二个用于预先显示。

#include<stdio.h>
#include<stdlib.h>

struct btree {
    int val;
    struct btree *left;
    struct btree *right;
};

static int c=0;
typedef struct btree node;

void tinsert( node *n,int a)
{
    c++;
    printf("%d\n",c);
    if(n==NULL)
    {
        n=(node *)malloc(sizeof(node));
        n->left=NULL;
        n->right=NULL;
        n->val=a;
        //printf("adding root %d\n",n->val);
        //n=temp;
    }
    else if(a>=(n->val))
        tinsert(n->right,a);
    else
        tinsert(n->left,a);
    return ;
}

void preorder_display(node *n)
{
    if(n!=NULL)
    {
        printf("%d\n",n->val);
        preorder_display(n->left);
        preorder_display(n->right);
    }
    else
        printf("tree is null\n");
}

int main()
{
    //int N;
    //int num[100];
    //int i;
    node *ntree=NULL;

    tinsert(ntree,4);
    tinsert(ntree,6);
    tinsert(ntree,8);
    tinsert(ntree,1);

    printf("tree is \n");
    preorder_display(ntree);

    return 0;
}

4 个答案:

答案 0 :(得分:2)

tinsert适用于ntree的本地副本,但不会更改main中的副本。您可以通过传递指针来修复它(即:双指针,指向指针的指针)。

因此,您的tinsert将如下所示:

void tinsert( node **n,int a)

在你的main中,你会这样称呼它:

tinsert(&ntree,4);

当然,您需要调整tinsert中的代码以取消引用指针并正确访问它。

或者在main

中分配根节点

答案 1 :(得分:0)

您将根节点ntree按值传递给tinsert函数,因此当函数完成时,您将保留原始值ntree NULL
你最好重写你的函数,所以你将指针传递给指针

 void tinsert( node **n,int a)


 //and invocation is like that :

  tinsert(&ntree,4);

答案 2 :(得分:0)

当你将ntree从main传递给tinsert函数时, 将新副本创建到您的节点* n;

一种方法是使用指向指针的指针 或者第二个解决方案在这里:

这是一个解决方案:

#include<stdio.h>
#include<stdlib.h>

struct btree{
int val;
struct btree *left;
struct btree *right;
};

static int c=0;
typedef struct btree node;

node* tinsert( node *n,int a)
{
c++;
printf("%d\n",c);
  if(n==NULL)
{ 

   n=(node *)malloc(sizeof(node));
   n->left=NULL;
   n->right=NULL;
   n->val=a;

 //printf("adding root %d\n",n->val);
 //n=temp;
}
else if(a>=(n->val))
tinsert(n->right,a);
else
tinsert(n->left,a);

return n;
}



void preorder_display(node *n)
{
if(n!=NULL)
{
printf("%d\n",n->val);
preorder_display(n->left);
preorder_display(n->right);
}
else
printf("tree is null\n");
}




int main()
{
//int N;
//int num[100];
//int i;
node *ntree=NULL;



ntree=tinsert(ntree,4);
ntree=tinsert(ntree,6);
ntree=tinsert(ntree,8);
ntree=tinsert(ntree,1);

printf("tree is \n");
preorder_display(ntree);


return 0;
}

答案 3 :(得分:0)

C仅支持pass by value 。但是,这并不妨碍您从另一个函数修改变量的值,因为您始终可以使用它的内存来引用变量;在C中它通过pointers完成,这是一个代表内存位置的抽象。

将值传递给函数时,实际参数的值将复制到formal参数的值。请注意,指针的值是它指向的地址。因此,此值将复制到形式参数中。因此函数内的新指针指向原始变量的完全相同的位置。您可以随时使用指针来操纵它的值。

在这里,您需要操纵指针。所以你将一个指向指针的指针传递给函数:

tinsert(&ntree,4);

在你的函数中,你需要它来获得原始指针;如下:

void tinsert(node **n, int a)
{
    //...
    *n = malloc(sizeof(node));
    //...
}