| 发表于:2008-01-22 16:23:521楼 得分:0 |
#include <iostream.h> #include <stdlib.h> typedef struct node /*该结构体类型为二叉排序树的结点类型*/ { int key;/*元素的关键字*/ struct node *lchild; struct node *rchild; } tnode; void insertbst(tnode *&t,tnode *s)/*如果t中没有结点*s,就将该结点插入t中*/ { /*首先应该在原来的树t中查找,确定t中是否存在结点*s。如果存在,就不需再插入*/ tnode *f;/*如果t中存在该结点,则f指向该结点;否则,f指向新插入结点的双亲结点*/ tnode *p=t; while(p) { f=p; if(s-> key==p-> key) return; /*结点*s在树t中存在,不需要插入*/ else if(s-> key <p-> key) p=p-> lchild; else p=p-> rchild; } /*退出循环时p为空,有可能t本身就为空*/ if(!t) t=s; else { if(s-> key <f-> key) f-> lchild=s; else f-> rchild=s; } } void invisitbst(tnode *t)/*中序遍历二叉排序树,输出结点的关键字*/ { if(t) { invisitbst(t-> lchild ); cout < <t-> key < <" " ; invisitbst(t-> rchild ); } } tnode* searchbst(tnode *t,int key)/*在二叉排序树中,查找关键字为key的结点*/ { if(t) { if(key==t-> key) return t; else if(key> t-> key) searchbst(t-> rchild ,key); else searchbst(t-> lchild ,key); } else return null; } void delete(tnode *&t) /*删除结点*t*/ { tnode *temp,*temp1; if(t-> rchild ==null) { temp=t; t=t-> lchild ; free(temp); } else if(t-> lchild ==null) { temp=t; t=t-> rchild ; free(temp); } else { temp=t; t=t-> lchild ; temp1=t; while(temp1-> rchild ) temp1=temp1-> rchild ; temp1-> rchild =temp-> rchild ; free(temp); } } void deletebst(tnode *&t,int key)/*在树t中删除关键字为key结点*/ { if(t-> key ==key) delete(t); /*删除结点*t*/ else if(t-> key > key) deletebst(t-> lchild ,key); else deletebst(t-> rchild ,key); } main() { /*以关键字序列{45,24,53,12,37,93}为例*/ tnode *t; t=null; for(int i=0;i <6;i++) { tnode *s=(tnode *)malloc(sizeof(tnode)); cin> > s-> key ; s-> lchild =s-> rchild =null; insertbst(t,s); } invisitbst(t); cout < <endl; deletebst(t,45); invisitbst(t); cout < <endl; } | | |
|