1 //二叉查找树的建立,插入,删除操作 2 #include<stdio.h> 3 #include<stdlib.h> 4 5 typedef struct bsTree 6 { 7 int k ; 8 struct bsTree * lchild , * rchild ; 9 }bstnode , * bstree ; 10 11 void create_tree(bstree *T,int k1) 12 { 13 (*T) = (bstree)malloc(sizeof(bstnode)); 14 if(!(*T)){ 15 fprintf(stderr , "malloc error!\n"); 16 exit(EXIT_FAILURE) ; 17 } 18 (*T)->k = k1 ; 19 (*T)->lchild = (*T)->rchild = NULL; 20 } 21 22 bstree search(bstree T , int k ) //递归搜寻某个关键字为k 的节点 23 { 24 if(!T) return NULL; 25 if(k == T->k) return T ; 26 if(k < T->k) return search(T->lchild , k ) ; 27 if(k > T->k) return search(T->rchild , k ) ; 28 } 29 30 bstnode *itersearch(bstree T , int k ) //非递归搜寻某个关键字为k 的节点 31 { 32 while(T){ 33 if(k == T->k) return T ; 34 if(k < T->k) T = T->lchild ; 35 else T = T->rchild ; 36 } 37 return NULL; 38 } 39 40 bstree modifiedSearch(bstree T , int k1 ) //改进的搜寻 返回要insert的位置的上一个节点,用于插入操作 41 { 42 bstree pre = T ; 43 while(T){ 44 if(k1 == T->k) return T ; 45 pre = T ; 46 if(k1 < T->k) T = T->lchild ; 47 else T = T->rchild ; 48 } 49 return pre; 50 } 51 52 bstree modifiedSearch2(bstree T , int k1 ) //改进的搜寻 返回要insert的位置的上一个节点 用于删除操作 53 { 54 bstree pre = T ; 55 while(T){ 56 if(k1 == T->k) return pre ; 57 pre = T ; 58 if(k1 < T->k) T = T->lchild ; 59 else T = T->rchild ; 60 } 61 return NULL; 62 } 63 64 void insert(bstree T , bstree * tmp ,int k1 ) //插入操作 要用到modifiedSearch()函数 65 { 66 bstree ptr ; 67 (*tmp) = modifiedSearch(T,k1); 68 if( *tmp ){ 69 ptr = (bstree)malloc(sizeof(bstnode)) ; 70 ptr->k = k1 ; 71 ptr->lchild = ptr->rchild = NULL ; 72 if(k1 < (*tmp)->k) (*tmp)->lchild = ptr ; 73 else (*tmp)->rchild = ptr ; 74 } 75 } 76 77 void in_order_traverse(bstree T) // 中序遍历 查找树 78 { 79 if(T){ 80 81 in_order_traverse(T->lchild) ; 82 printf("%d ",T->k) ; 83 in_order_traverse(T->rchild) ; 84 } 85 } 86 87 bstree remove1( bstree T , int k1) 88 { 89 int f ;bstree Rf = T,R = NULL; 90 Rf = modifiedSearch2(T,k1) ; 91 if(k1 > Rf->k ) { 92 f = 1 ; R = Rf->rchild ; 93 }else{ 94 f = 0 ; R = Rf->lchild ; 95 } 96 97 if(!R->lchild && !R->rchild){ 98 if(f) Rf->rchild = NULL ;else Rf->lchild = NULL ; 99 } 100 else if(R->lchild || R->rchild ){ 101 if(f) Rf->rchild = NULL ;else Rf->lchild = NULL ; 102 } 103 else { 104 bstree tmp = R; 105 while( tmp->lchild) 106 tmp = R->lchild ; 107 R->k = tmp->k ; 108 R->lchild = NULL ; 109 } 110 return R ; 111 } 112 113 int main() 114 { 115 bstree T ; 116 int i ; 117 create_tree(&T , 30) ; 118 bstree tmp ; 119 tmp = (bstree)malloc(sizeof(bstnode)) ; 120 insert(T , &tmp ,5) ; 121 bstree tmp1 ; 122 tmp1 = (bstree)malloc(sizeof(bstnode)) ; 123 insert(T , &tmp1 ,40) ; 124 bstree tmp2 ; 125 tmp2 = (bstree)malloc(sizeof(bstnode)) ; 126 insert(T , &tmp2 ,35) ; 127 bstree tmp3 ; 128 tmp3 = (bstree)malloc(sizeof(bstnode)) ; 129 insert(T , &tmp2 ,45) ; 130 remove1(T,40); 131 in_order_traverse(T); 132 return 0 ; 133 }