/* bst.h */
#ifndef BST_H
#define BST_H
typedef struct node *link;
struct node {
unsigned char item;
link l, r;
};
link search(link t, int key);
link insert(link t, int key);
link delete(link t, int key);
void print_tree(link t);
#endif
#################################################
// bst.c
#include<stdlib.h>
#include<stdio.h>
#include"bst.h"
static link make_node(unsigned char item){
link p = malloc(sizeof *p);
p->item = item;
p->l = p->r = NULL;
return p;
}
static void free_node(link p){
free(p);
}
link search(link t, int key){
if (!t)
return NULL;
if (t->item > key)
return search(t->l, key); // 没找到,继续查找,层层返回
if (t->item < key)
return search(t->r, key); // 没找到,继续查找,层层返回
return t; // 找到,并返回需要的指针
}
link insert(link t, int key){ // insert返回输入的指针
if (!t) // 找到
return make_node(key); // 插入并返回新节点的指针
if (t->item > key)
t->l = insert(t->l, key); // 没找的的情况下,insert返回输入的指针,不插入的地方指向不变
else
t->r = insert(t->r, key); // 没找的的情况下,insert返回输入的指针,不插入的地方指向不变
return t; // 没找的的情况下,insert返回输入的指针,不插入的地方指向不变
}
link delete(link t, int key){
link p;
if (!t)
return NULL;
if (t->item > key)
t->l = delete(t->l, key);
else if (t->item < key)
t->r = delete(t->r, key);
else {
if (t->l == NULL && t->r == NULL) { //删除节点为叶子节点
free_node(t);
t = NULL;
}
else if (t->l) { // 待删除的节点有左子树
for (p=t->l; p->r; p=p->r);
t->item = p->item;
t->l = delete(t->l, t->item);
}
else if (t->r) { // 待删除的节点有右子树
for (p=t->r; p->l; p=p->l);
t->item = p->item;
t->r = delete(t->r, t->item);
}
}
return t;
}
void print_tree(link t){
if (t) {
printf("(");
printf("%d", t->item);
print_tree(t->l);
print_tree(t->r);
printf(")");
}
else
printf("()");
}
#################################################
// main.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "bst.h"
#define RANGE 100
#define N 6
void print_item(link p){
printf("%d", p->item);
}
int main(){
int i, key;
link root = NULL;
srand(time(NULL));
for (i = 0; i < N; i++)
root = insert(root, rand() % RANGE);
printf("\t\\tree");
print_tree(root);
printf("\n\n");
while (root) {
key = rand() % RANGE;
if (search(root, key)) {
printf("delete %d in tree\n", key);
root = delete(root, key);
printf("\t\\tree");
print_tree(root);
printf("\n\n");
}
}
}