1 #include"stdio.h" 2 #include"malloc.h" 3 typedef int elemtype; 4 typedef struct btnode 5 { 6 elemtype data;/*关键字域*/ 7 struct btnode *lchild,*rchild; 8 }btnode,*bitree; 9 int searchBST(bitree t, elemtype key, bitree f,bitree *p) 10 /*递归查找二叉排序树t是否存在key,指针f指向t的双亲,其初始调用值为NULL,若查找成功, 11 则指针p指向该数据元素结点并返回1,否则指针p指向查找路径上访问的最后一个结点并返回0*/ 12 { 13 if (!t){ *p=f; return 0;}//查找不成功 14 else if(key==t->data)//查找成功 15 { 16 *p=t; 17 return 1; 18 } 19 else if(key<t->data) 20 return searchBST(t->lchild,key,t,p);//在左子树继续查找 21 else 22 return searchBST(t->rchild,key,t,p);//在右子树继续查找 23 } 24 25 int insertBST(bitree *t, elemtype key) 26 /*当二叉排序树T中不存在关键字等于key的数据元素时,插入key返回二叉排序树的根结点。*/ 27 { 28 bitree p,s; 29 if (!searchBST(*t,key,NULL,&p)) /*查找不成功*/ 30 { 31 s=(bitree)malloc(sizeof(btnode)); 32 s->data=key; 33 s->lchild = s->rchild = NULL; 34 if (!p) *t=s; /*插入s为新的根结点*/ 35 else if ( key< p->data) 36 p->lchild=s; /*插入s为左孩子*/ 37 else 38 p->rchild=s; /*插入s为右孩子*/ 39 return 1; 40 } 41 else 42 return 0; 43 } 44 void inorder(bitree bt) //中序遍历 45 { 46 if(bt==NULL)return; 47 else{ 48 inorder(bt->lchild); 49 printf("%d ",bt->data); 50 inorder(bt->rchild); 51 } 52 } 53 /*若二叉排序树存在关键字等于key的数据元素时,则删除该数据元素结点*/ 54 int deleteBST(bitree *t, elemtype key) 55 { 56 if(!*t)//不存在关键字等于key的数据元素 57 return 0; 58 else 59 { 60 if(key==(*t)->data) 61 return delete(t); 62 else if(key<(*t)->data) 63 return deleteBST(&(*t)->lchild,key); 64 else 65 return deleteBST(&(*t)->rchild,key); 66 } 67 } 68 int delete(bitree *p) 69 { 70 bitree q,s; 71 if((*p)->rchild==NULL)//右子树空则只需重接它的左子树 72 { 73 q=*p;*p=(*p)->lchild;free(q); 74 } 75 else if((*p)->lchild==NULL)//只需重接它的右子树 76 { 77 q=*p;*p=(*p)->rchild;free(q); 78 } 79 else//左右子树都不空 80 { 81 q=*p;s=(*p)->lchild; 82 while(s->rchild){//转左,然后向右到尽头 83 q=s;s=s->rchild; 84 85 } 86 (*p)->data=s->data;//s指向被删结点的直接前驱 87 if(q!=*p) 88 q->rchild=s->lchild;//重接q的右子树 89 else 90 q->lchild=s->lchild;//重接q的左子树 91 free(s); 92 } 93 return 1; 94 } 95 int main() 96 { 97 int i;bitree f=NULL,p; 98 int a[10]={62,88,58,47,35,73,51,99,37,93}; 99 bitree t=NULL; 100 for(i=0;i<10;i++) 101 { 102 insertBST(&t, a[i]);//插入 103 } 104 inorder(t); 105 printf("\n"); 106 if(searchBST(t,88,f,&p)==1); 107 printf("查找成功,p已指向该元素!"); 108 deleteBST(&t,37);//删除 109 printf("\n删除后:\n"); 110 inorder(t); 111 printf("\n"); 112 return 0; 113 }
转载于:https://www.cnblogs.com/1772642558sgzj/p/9354916.html