struct b_node* search_bst(struct b_node* node, int data) { if (node == NULL) { //Nonexisting node - return NULL return NULL; } if (node-> value == data) { //Found the correct value return node; } if (node->value > data) { //Data being searched is too small, has to be in //left subtree return search_bst(node-> left, data); } if(node->value < data) { //Data is too big has to be in ln //right subtree return search_bst(node->right, data); } //We have covered all three comparison cases, so reaching //here is only possible with error return NULL; }
int search_bst(BiTree T, int value, BiTree father, BiTree *p){ if (!T){ *p = father; return 0; } else if (value == T->data){ *p = T; return 1; } else if (value < T->data) return search_bst(T->lchild, value, T, p); else return search_bst(T->rchild, value, T, p); }
bool delete_bst(node_pointer_t root, int data) { node_pointer_t tmp_node = NULL; node_pointer_t pre_node = NULL; node_pointer_t max_node = NULL; tmp_node = search_bst(root, data); pre_node = search_parent(root, data); if(tmp_node->rchild&&tmp_node->lchild) { pre_node = tmp_node; max_node = tmp_node->lchild; while(max_node->rchild) { pre_node = max_node; max_node = max_node->rchild; } tmp_node->data = max_node->data; if(pre_node->rchild->data == max_node->data) pre_node->rchild = max_node->lchild; else pre_node->lchild = max_node->lchild; free(max_node); } else if((max_node = tmp_node->rchild)||(max_node = tmp_node->lchild)) { if(pre_node->rchild&&pre_node->rchild->data == data) pre_node->rchild = max_node; else pre_node->lchild = max_node; free(tmp_node); } else { if(pre_node->rchild&&pre_node->rchild->data == data) pre_node->rchild = NULL; else pre_node->lchild = NULL; free(tmp_node); } return true; }
binaryTreeNode* search_bst(binaryTreeNode ** tree,binaryTreeElementT value) { if(!(*tree)) { return NULL; } if((*tree)->value==value){ return *tree; }else if((*tree)->value>value) { return search_bst(&(*tree)->left, value); }else { return search_bst(&(*tree)->right, value); } }
int insert_bst(BiTree *T, int value){ BiTree p,s; if (!search_bst(*T, value, NULL, &p)){ s = (BiTree)malloc(sizeof(BiTNode)); s->data = value; s->lchild = s->rchild = NULL; if (!p) *T = s; else if (value < p->data) p->lchild = s; else p->rchild = s; return 1; } else return 0; }
int retrieve(char *com1,char *com2) { FILE *fp; char buffer[200]; int k=0,j=0,offset; extern int count; char *temp,*temp1,*temp3; bst_node *search; temp=strtok(com2,"="); temp1=strtok(NULL,"\n"); if((search=search_bst(cdsdetail.rootNode,temp1))==NULL) { printf("%s\n",ERR_CDS_RETRIEVE_DATASTORE_02); return 0; } offset=(search->offset)-1; //if(search->flag==1)return 0; strcat(com1,","); temp3=strtok(com1,","); fp=fopen(com1,"rb"); strcpy(buffer,SUCCESS_CDS_RETRIEVE_DATASTORE_00); retrieveFromFile(com1,offset,fp,buffer); fclose(fp); while(com1!=NULL) { if((com1=strtok(NULL,","))!=NULL) { fp=fopen(com1,"rb"); strcat(buffer,","); retrieveFromFile(com1,offset,fp,buffer); fclose(fp); } else break; } printf("%s\n",buffer); return 1; }
bool insert_bst(node_pointer_t *root, int data) { node_pointer_t tmp_node = NULL; node_pointer_t new_node = NULL; tmp_node = search_bst(*root, data); if(tmp_node) { fprintf(stderr, " ERROR: same data already exist\n"); return false; } new_node = get_new_node(data); if(!new_node) { fprintf(stderr, " ERROR: memory is full\n"); return false; } if(!*root) { *root = new_node; return true; } tmp_node = search_parent(*root, data); if(tmp_node->data < data) tmp_node->rchild = new_node; else if(tmp_node->data > data) tmp_node->lchild = new_node; return true; }
int main() { int i, key; link root = NULL; srand(time(NULL)); for (i = 0; i < N; i++) root = insert_bst(root, rand() % RANGE); printf("\t\\tree"); print_bst(root); printf("\n\n"); while (root) { key = rand() % RANGE; if (search_bst(root, key)) { printf("delete %d in tree\n", key); root = delete_bst(root, key); printf("\t\\tree"); print_bst(root); printf("\n\n"); } } return 0; }