以下代码读取输入数组,并从中构造BST。如果当前arr [i]是树中节点的重复,则丢弃arr [i]。 struct节点中的count指的是数字在数组中出现的次数。 fi指的是数组中找到的元素的第一个索引。插入后,我正在进行树的后序遍历并打印数据,计数和索引(按此顺序)。我运行此代码时获得的输出是:
0 0 7
0 0 6
谢谢你的帮助。
Jeev
struct node{
int data;
struct node *left;
struct node *right;
int fi;
int count;
};
struct node* binSearchTree(int arr[], int size);
int setdata(struct node**node, int data, int index);
void insert(int data, struct node **root, int index);
void sortOnCount(struct node* root);
void main(){
int arr[] = {2,5,2,8,5,6,8,8};
int size = sizeof(arr)/sizeof(arr[0]);
struct node* temp = binSearchTree(arr, size);
sortOnCount(temp);
}
struct node* binSearchTree(int arr[], int size){
struct node* root = (struct node*)malloc(sizeof(struct node));
if(!setdata(&root, arr[0], 0))
fprintf(stderr, "root couldn't be initialized");
int i = 1;
for(;i<size;i++){
insert(arr[i], &root, i);
}
return root;
}
int setdata(struct node** nod, int data, int index){
if(*nod!=NULL){
(*nod)->fi = index;
(*nod)->left = NULL;
(*nod)->right = NULL;
return 1;
}
return 0;
}
void insert(int data, struct node **root, int index){
struct node* new = (struct node*)malloc(sizeof(struct node));
setdata(&new, data, index);
struct node** temp = root;
while(1){
if(data<=(*temp)->data){
if((*temp)->left!=NULL)
*temp=(*temp)->left;
else{
(*temp)->left = new;
break;
}
}
else if(data>(*temp)->data){
if((*temp)->right!=NULL)
*temp=(*temp)->right;
else{
(*temp)->right = new;
break;
}
}
else{
(*temp)->count++;
free(new);
break;
}
}
}
void sortOnCount(struct node* root){
if(root!=NULL){
sortOnCount(root->left);
sortOnCount(root->right);
printf("%d %d %d\n", (root)->data, (root)->count, (root)->fi);
}
}
答案 0 :(得分:0)
在插入函数的while循环中放入if条件。
while(1)
{
if(data==(*temp)->data)
break;
else
{
your stuff;
}
}
这可能是你的答案。
答案 1 :(得分:0)
嗯,对于一个,你在指向插入函数中的指针传递一个指针:
void insert(int data, struct node **root, int index);
然后你有一个临时变量:
struct node** temp = root;
用于遍历树。当你这样做时,你正在改变你的根。只需传递一个指针,即
void insert(int data, node *root , int index){
其次,if(data<=(*temp)->data){
应该只是&lt;,而不是&lt; =。
提示:一般情况下,实际上需要将指针传递给指针时,这种情况非常罕见。