打印阵列的所有独特元素

时间:2015-05-29 12:19:56

标签: c binary-search-tree

我正在尝试使用二叉搜索树打印给定数组的所有唯一元素。

我在做什么:

  1. 输入数组中的所有数字。
  2. 在bst中逐个搜索数组的每个元素,
    • if(在bst中找不到元素)
      • 把它放在那里打印
    • 否则
      • 转到下一个元素
  3. #include<stdlib.h>
    #include<stdio.h>
    
    struct node
    {   
        int data;
        struct node* left;
        struct node* right;
    } *root = NULL;
    
    void insert(struct node *n, int value)
    {
        if (n == NULL)
        {
            n = (struct node*)malloc(sizeof(struct node));
            n->data = value;
            n->left = NULL;
            n->right = NULL;
            printf("%d ", value);
            return;
        }
    
        if ((n->data) == value)
            return;
        if ((n->data) > value)
            insert(n->left, value);
        else
            insert(n->right, value);
    }   
    
    int main()
    {
        int a[100], i, n;
        printf("Enter the number of elements : ");
        scanf("%d",&n);
        for (i = 0; i < n; i++)
            scanf("%d",&a[i]);
        printf("After removal of duplicates, the new list is : \n");
        for (i = 0; i < n; i++)
            insert(root, a[i]);
        printf("\n");
        return 0;
    }       
    

3 个答案:

答案 0 :(得分:0)

您的代码有一些错误,您的函数插入应返回结构节点*,否则您将不会构建二进制搜索树。 在您的初始代码中,当您调用insert时,您始终使用空节点进行调用。

这是你应该做的,只需要很少的改变。

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

struct node
{   
    int data;
    struct node* left;
    struct node* right;
} *root = NULL;

struct node* insert(struct node *n, int value)
{
    if (n == NULL){
        n = (struct node*)malloc(sizeof(struct node));
        n->data = value;
        n->left = NULL;
        n->right = NULL;
        printf("inserted %d\n", value);
        return n;
    }else{
        if( value == n->data){
            printf("Duplicated Value %d\n", value);
            return n;
        }
        if ( (n->data) > value ){
            n->left = insert(n->left, value);
        }else{
            n->right = insert(n->right, value);
        }
        return n;
    }
}   

int main()
{
    int a[100], i, n;
    printf("Enter the number of elements : ");
    scanf("%d",&n);
    for (i = 0; i < n; i++)
        scanf("%d",&a[i]);
    printf("After removal of duplicates, the new list is : \n");
    for (i = 0; i < n; i++)
        root = insert(root, a[i]);
    printf("\n");
    return 0;
}   

顺便说一下,this应该是有用的,这是一个测试example。 ;)

你应该创建一个AFTER数组,你知道它的大小,否则你可能会分配太多的内存。当然,您应该让用户可以创建一个包含100多个元素的二叉树

int i, n;
printf("Enter the number of elements : ");
scanf("%d",&n);
int a[n];

答案 1 :(得分:0)

第一: 不要返回无效..但如果你喜欢你需要返回树的地址,因为它每次调用函数时都会改变!  在过去的代码中,每次节点未与左右连接时,您都会发送不同的树。

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

struct node
{   
    int data;
    struct node* left;
    struct node* right;
} *root = NULL;

struct node* insert(struct node *n, int value)
{

    if (n == NULL){
        n = (struct node*)malloc(sizeof(struct node));
        n->data = value;
        n->left = NULL;
        n->right = NULL;
        printf("%d ", value);
        return n;
    }

    else if( value == n->data)
              return n;

    else  if ((n->data) > value)
               n->left = insert(n->left, value);

        else
            insert(n->right, value);

        return n;
    }


int main()
{
    int a[100], i, n;
    printf("Enter the number of elements : ");
    scanf("%d",&n);
    for (i = 0; i < n; i++)
        scanf("%d",&a[i]);
    printf("After removal of duplicates, the new list is : \n");
    for (i = 0; i < n; i++)
        root = insert(root, a[i]);
    printf("\n");
    return 0;
}   

Ps:那个人告诉你:

int i, n;
printf("Enter the number of elements : ");
scanf("%d",&n);
int a[n];
你不能在c中这样做!! 你必须知道表的大小,你不能使一个长度的表是一个变量! (用于分配c中需要的大小,使用链表)

答案 2 :(得分:0)

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

    struct node
{   
  int data;
  struct node* left;
  struct node* right;
} *root = NULL;

struct node* insert(struct node *n, int value)
{

  if (n == NULL){
    n = (struct node*)malloc(sizeof(struct node));
    n->data = value;
    n->left = NULL;
    n->right = NULL;
    printf("%d ", value);
    return n;
}

else if( value == n->data)
          return n;

else  if ((n->data) > value)
           n->left = insert(n->left, value);

    else
        insert(n->right, value);

    return n;
}


int main()
{
  int a[100], i, n;
  printf("Enter the number of elements : ");
  scanf("%d",&n);
  for (i = 0; i < n; i++)
    scanf("%d",&a[i]);
  printf("After removal of duplicates, the new list is : \n");
  for (i = 0; i < n; i++)
    root = insert(root, a[i]);
  printf("\n");
  return 0;
}   

您可以修改动态分配代码。

int *a,n;
scanf("%d",n);
a = (int)malloc(n*sizeof(int));