www.pudn.com > gc.rar > GC_863.C


# include  
# include  
 
typedef struct node2 {  /*±ê×¼´æ´¢½á¹¹*/ 
	char data; 
	struct node2 *lchild; 
	struct node2 *rchild; 
}TNODE2; 
 
 
/*º¯Êý,ÖÐÐò±éÀú*/ 
void re_midorder(TNODE2 *t) 
{ 
	if (t != NULL)  {           /*·Ç¿Õ¶þ²æÊ÷*/ 
		re_midorder(t->lchild); 
		printf("%c",t->data); 
		re_midorder(t->rchild); 
	} 
} 
 
 
/*¾²Ì¬²éÕÒº¯Êý*/ 
TNODE2 * j_serach(TNODE2 *t, char key) /*t:²éÕÒÊ÷¸ù½áµãÖ¸Õë*/ 
{ 
	while (t!=NULL) 
		if(t->data == key) return t;               /*ÕÒµ½*/ 
		else if(key < t->data) t = t->lchild;        /*ÑØ×ó×ÓÊ÷²éÕÒ*/ 
			else t=t->rchild;                         /*ÑØÓÒ×ÓÊ÷²éÕÒ*/ 
	return NULL;                                    /*δÕÒµ½*/ 
} 
 
 
/*¶¯Ì¬²éÕÒº¯Êý*/ 
void search(TNODE2 *t,                     /*²éÕÒÊ÷µÄ¸ù½áµãÖ¸Õë*/ 
            char key,                     /*²éÕÒÖµ*/ 
			TNODE2 **pkpt,                 /*key½áµãµÄ¸¸½áµãµÄÖ¸ÕëµÄÖ¸Õë*/ 
			TNODE2 **kpt)                  /*key½áµãµÄÖ¸ÕëµÄÖ¸Õë*/ 
{ 
	*pkpt = NULL; 
	*kpt = t;                         /*´Ó²éÕÒÊ÷µÄ¸ù½áµã¿ªÊ¼Ñ°ÕÒ*/ 
	while(*kpt != NULL) { 
		if((*kpt)->data == key) return;      /*ÕÒµ½*/ 
		*pkpt = *kpt;                         /*µ±Ç°½áµã×÷Ϊ¸¸½áµã,¼ÌÐø²éÕÒ*/ 
		/*°´²éÕÒÊ÷µÄÐÔÖÊ,È·¶¨²éÕÒ·¾¶:  */ 
		if(key<(*kpt)->data) *kpt= (*kpt)->lchild; 
		else *kpt = (*kpt)->rchild; 
	} 
} 
 
 
/*º¯Êý,²éÕÒÊ÷ÉϲåÈë½áµã*/ 
/*²åÈë³É¹¦,º¯Êý·µ»Ø0,·ñÔòº¯Êý·µ»Ø1 */ 
int insert(TNODE2 **pt,char key) 
{ 
	TNODE2 *p,*q,*r; 
	search(*pt,key,&p,&q);                     /*ѰÕÒ²åÈëλÖÃ*/ 
	if(q!=NULL) return 1;                      /*ÒÑÔÚÊ÷ÖÐ,²»ÔÙ²åÈë*/ 
	r = (TNODE2 *)malloc(sizeof(TNODE2));       /*нáµã*/ 
	r->data=key; 
	r->lchild=r->rchild=NULL; 
	if(p == NULL) *pt = r;                    /*ÈçΪ¿ÕÊ÷,нáµãΪ²éÕÒÊ÷*/ 
	else if(p->data>key) 
		p->lchild = r;                       /*×÷Ϊ×Ó½áµã*/ 
	else p->rchild=r;                       /*×÷ΪÓÒ½áµã*/ 
	return 0;                            /*²åÈë³É¹¦*/ 
} 
 
 
/*º¯Êý,ɾ³ý²éÕÒÊ÷¼üֵΪkeyµÄ½áµã*/ 
int delete(TNODE2 **pt,char key) 
{ 
	TNODE2 *p,*q,*r; 
	search(*pt,key,&p,&q); 
	if(q == NULL) return 1; 
	if(p == NULL)                      /*±»É¾³ý½áµãÊǸù½áµã*/ 
		if(q->lchild == NULL) 
			/*±»É¾½áµãÎÞ×ó×ÓÊ÷,±»É¾½áµãµÄÓÒ×ÓÊ÷×÷Ϊɾ³ýºóµÄÊ÷*/ 
			*pt=q->rchild; 
		else {                  /*±»É¾½áµãÓÐ×ó×ÓÊ÷,Óñ»É¾½áµãµÄ×ó×Ó½áµã×÷Ϊ¸ù½áµã*/ 
			*pt = q->lchild; 
			/*ѰÕÒ±»É¾½áµãµÄ×ó×ÓÊ÷°´ÖÐÐò×îºóÒ»¸ö½áµã*/ 
			r=q->lchild; 
			while(r->rchild!=NULL) 
			r=r->rchild; 
			/*±»É¾½áµãµÄÓÒ×ÓÊ÷×÷ΪÕÒµ½½ÚµãµÄÓÒ×ÓÊ÷*/ 
			r->rchild=q->rchild; 
		} 
	else if(q->lchild == NULL) 
		/*±»É¾½áµã²»ÊǸù½áµã,ÇÒ±»É¾½áµãÎÞ×ó×Ó½áµã*/ 
		if(q == p->lchild) 
			/*±»É¾½áµãÊÇËûµÄ¸¸½áµãµÄ×ó×Ó½áµã,°Ñ±»É¾½áµãµÄÓÒ×ÓÊ÷×÷Ϊ±»É¾½áµãµÄ¸¸½áµãµÄ×ó×ÓÊ÷*/ 
			p->lchild = q->rchild; 
		else  /*±»É¾½áµãÊÇËüµÄ¸¸½áµãµÄÓÒ×Ó½áµã,°Ñ±»É¾½áµãµÄÓÒ×ÓÊ÷×÷Ϊ±»É¾½áµãµÄ¸¸½áµãµÄÓÒ×ÓÊ÷*/ 
			p->rchild = q->rchild; 
 
	else { 
	/*±»É¾½áµã²»ÊǸù½áµã,ÇÒ±»É¾½áµãÓÐ×ó×Ó½áµã*/ 
	/*ѰÕÒ±»É¾½áµãµÄ×ó×ÓÊ÷°´ÖÐÐò±éÀúµÄ×îºóÒ»¸ö½áµã*/ 
	r=q->rchild; 
		while(r->rchild != NULL) r = r->rchild; 
		r->rchild= q->rchild;  /*±»É¾½áµãµÄÓÒ×ÓÊ÷×÷ΪÕÒµ½µÄ½áµãµÄÓÒ×ÓÊ÷*/ 
		if (q == p->lchild)    /*±»É¾½áµãÊÇËüµÄ¸¸½áµãµÄ×ó×Ó½áµã,*/ 
			p->lchild=q->lchild; /*°Ñ±»É¾½áµãµÄ×ó×ÓÊ÷×÷Ϊ±»É¾½áµãµÄ¸¸½áµãµÄ×ó×ÓÊ÷*/ 
		else   /*±»É¾½áµãÊÇËüµÄ¸¸½áµãµÄÓÒ×Ó½áµã,*/ 
			p->rchild = q->lchild;  /*°Ñ±»É¾½áµãµÄ×ó×ÓÊ÷×÷Ϊ±»É¾½áµãµÄ¸¸½áµãµÄÓÒ×ÓÊ÷*/ 
	} 
	free(q); 
	return 0; 
} 
 
 
void main() 
{ 
	TNODE2 *root=NULL;         //¶þ²æÊ÷µÄ¸ùÖ¸Õë 
	char key; 
	TNODE2 *pkpt;         /*key½áµãµÄ¸¸½áµãµÄÖ¸ÕëµÄÖ¸Õë*/ 
	TNODE2 *kpt;		/*key½áµãµÄÖ¸ÕëµÄÖ¸Õë*/ 
	TNODE2 *p; 
	int x;               //Ñ¡Ïî 
 
	printf("ÇëÊäÈë×Ö·ûÖµ,½¨Á¢¶þ²æÅÅÐòÊ÷,ÊäÈë0½áÊøÊäÈë\n"); 
	scanf("%c",&key);             //¶ÁÈëÒ»¸ö¹Ø¼ü×Ö 
	while(key-48) {                    //¼ÙÉèÊäÈë0ÊÇÊäÈë½áÊø±êÖ¾key-ËüµÄascÂë,ÕâÑùÐÐÂð? 
	if(insert(&root,key)) printf("ÒÑÔÚÊ÷ÖÐ,²»²åÈë\n"); 
	scanf("%c",&key); 
	} 
    printf("ÖÐÐò±éÀúÎÒ¿´¿´\n"); 
	re_midorder(root); 
 
	printf("\n¾²Ì¬²éÕÒ,ÇëÊäÈëÒª²éÕÒµÄÖµ:\n"); 
	/*»Ø³µÒ²»áµ±×÷ÊäÈë,ËùÒÔÕâÀïÊ¡ÂÔµôËü,ÓÐûÓиüºÃµÄ°ì·¨ÄØ?*/ 
	scanf("%c",&key); 
	while (key == '\n') { 
		scanf("%c",&key); 
	} 
	p=j_serach(root,key); 
	if(p) printf("ÄÜÕÒµ½\n"); 
	else printf("²»ÄÜÕÒµ½\n"); 
 
	printf("\n¶¯Ì¬²éÕÒ,ÇëÊäÈëÒª²éÕÒµÄÖµ:\n"); 
	scanf("%c",&key); 
	while (key == '\n') { 
		scanf("%c",&key); 
	} 
	search(root,key,&pkpt,&kpt); 
	if (kpt == NULL && pkpt == NULL) printf("¸ù±¾Õâ¿ÃÊ÷¾ÍÊǿյÄ \n"); 
	else if (kpt == NULL) printf("ÕÒ²»µ½Õâ¸öÖµï!\n"); 
	else if (pkpt == NULL) printf("ÕÒµ½µÄÊǸù½áµã\n"); 
	else { 
		printf("ÕÒµ½ÁËÕâ¸öÖµ,ËüÊÇ%c,ËüµÄ¸¸½áµãÊÇ%c\n",kpt->data,pkpt->data); 
	} 
 
 
	printf("ɾ³ý½áµã\n"); 
	printf("ÊäÈëҪɾ³ýµÄ½áµã\n"); 
	scanf("%c",&key); 
	while (key == '\n') { 
		scanf("%c",&key); 
	} 
	if (delete(&root,key)) printf("ûÓÐÕâ¸öÖµ\n"); 
	re_midorder(root); 
 
	printf("\nÇëÑ¡ÔñÒÔÏµĹ¦ÄÜ\n"); 
	printf("1.²åÈëÒ»¸ö½áµã\n"); 
	printf("2.ɾ³ýÒ»¸ö½áµã\n"); 
	printf("0.Í˳öÑ­»·\n"); 
	scanf("%d",&x); 
	do { 
 
		switch(x) { 
			case 1: 
				printf("ÊäÈë²åÈëµÄÖµ\n"); 
				scanf("%c",&key); 
				while (key == '\n') { 
				scanf("%c",&key); 
				} 
				if (insert(&root,key)) printf("ÒÑÔÚÊ÷ÖÐ,²»ÔÙ²åÈë\n"); 
				break; 
			case 2: 
				printf("ÊäÈëҪɾ³ýµÄÖµ\n"); 
				scanf("%c",&key); 
				while (key == '\n') { 
				scanf("%c",&key); 
				} 
				if (delete(&root,key)) printf("ûÓÐÕâ¸öÖµ\n"); 
				break; 
			case 0: 
				break; 
		} 
 
		re_midorder(root); 
 
		printf("\n1.²åÈëÒ»¸ö½áµã\n"); 
		printf("2.ɾ³ýÒ»¸ö½áµã\n"); 
		printf("0.Í˳öÑ­»·\n"); 
		scanf("%d",&x); 
	}while (x != 0); 
 
 
 
 
}