我正在尝试使用二叉搜索树打印给定数组的所有唯一元素。
我在做什么:
#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;
}
答案 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));