bst.c |
| #include <stdio.h> #include <stdlib.h> #include "bst.h" #include "mylib.h" struct bstnode { char *key; bst left; bst right; }; bst bst_new(){ return NULL; } char *bst_search(bst b, char *key){ if(b == NULL) return NULL; /* strcmp(cs,ct) returns 0 if cs==ct strcmp(cs,ct) returns <0 if cs<ct strcmp(cs,ct) returns >0 if cs>ct */ if(!strcmp(key, b->key)) return b->key; else if(strcmp(key, b->key)<0) return bst_search(b->left, key); else return bst_search(b->right, key); } bst bst_insert(bst b, char *key){ if(b == NULL){ b = emalloc(sizeof *b); b->key = emalloc((strlen(key)+1) * sizeof (char)); strcpy(b->key, key); b->left = NULL; b->right = NULL; } else if(strcmp(key, b->key)<0) b->left = bst_insert(b->left, key); else if(strcmp(key, b->key)>0) b->right = bst_insert(b->right, key); return b; } void bst_inorder(bst b, void f(char *s)){ if(b == NULL) return; bst_inorder(b->left, f); f(b->key); bst_inorder(b->right, f); } void bst_preorder(bst b, void f(char *s)){ if(b == NULL) return; f(b->key); bst_inorder(b->left, f); bst_inorder(b->right, f); } void bst_postorder(bst b, void f(char *s)){ if(b == NULL) return; bst_inorder(b->left, f); bst_inorder(b->right, f); f(b->key); } bst bst_delete(bst b, char *key){ if(b == NULL) return NULL; /* Key does not exist */ if(strcmp(key, b->key)<0) b->left = bst_delete(b->left, key); /* Key may be in the left subtree */ else if(strcmp(key, b->key)>0) b->right = bst_delete(b->right, key);/* Key may be in the right subtree */ else { /* We have found it, now erradicate it! */ bst temp = NULL; if(b->left!=NULL && b->right!=NULL){ temp = b->right; while(temp->left!=NULL) temp = temp->left; free(b->key); b->key = emalloc((strlen(temp->key)+1) * sizeof (char)); strcpy(b->key, temp->key); b->right = bst_delete(b->right, key); } else { if(b->left!=NULL) temp = b->left; else temp = b->right; free(b->key); free(b); b = temp; } } return b; } |
James Little |