二叉排序树

刚开始做还觉得很难,但是后来发现只要肯想,努力的看书,最重要的是上课的时候听老师讲课后就能做出来#include<stdio.h> #include<stdlib.h> typedef struct bitnode { int data; bitnode *lchild,*rchild; }bitnode,*bitree; /* int searchbst(bitree T,int key,bitree f,bitree &p) //f的格式导致二叉树最后只能记录最后一个节点 { if(!T){p=f; return 0;} else if(T->data==key) { p=T;return 1;} else if(T->data>key) return searchbst(T->lchild,key,T,p); else return searchbst(T->rchild,key,T,p); } void insertbst(bitree &T,int key) { bitree p=NULL,f=NULL,s; if(!searchbst(T,key,NULL,p)) { s=(bitree)malloc(sizeof(bitnode)); s->data=key; s->lchild=s->rchild=NULL; if(!p) T=s; else if(key>p->data) p->rchild=s; else p->lchild=s; } return ; } */ void searchbst(bitree T,int key,bitree &f,bitree &p) //f的格式导致二叉树最后只能记录最后一个节点真相在于 //数据结构课上老师说的那句很通俗的话:要改变谁,就在谁前面加取地址符 { while(T!=NULL) { if(T->data==key) { p=T;break;} else if(T->data>key) { f=T;T=T->lchild;} else { f=T;T=T->rchild;} } } void insertbst(bitree &T,int key) //T导致崩溃 { bitree f=NULL,p=NULL,s; searchbst(T,key,f,p); if(p!=NULL) return ; s=(bitree)malloc(sizeof(bitnode)); s->data=key; s->rchild=s->lchild=NULL; if(f==NULL) T=s; else { if(key>f->data) f->rchild=s; else f->lchild=s; } } void createbst(bitree &T) //原本参数为bitree *T,改为bitree &T也能正常运行,但是编译时间明显加长 { int key=0; T=NULL; //初始化很重要的 //printf("%d",T->data); printf("输入元素值以完成bst,输入以-1结束/n"); scanf("%d",&key); while(key!=-1) { insertbst(T,key); scanf("%d",&key); } } /* void Delete(bitree &p) { bitree q,s; if(!p->rchild) {q=p;p=p->lchild;free(q);} else if(!p->lchild) {q=p;p=p->rchild;free(q);} else { q=p;s=p->lchild; while(s->rchild) { q=s; s=s->rchild; } p->data=s->data; if(q!=p) q->rchild=s->lchild; else q->lchild=s->lchild; delete s; } } void deletebst(bitree &T,int key) { if(!T) return; else { if(key==T->data) return Delete(T); else if(key<T->data) return deletebst(T->lchild,key); else return deletebst(T->rchild,key); } } */ void deletebst(bitree &T,int key) { bitree f=NULL,p=NULL,s,q; searchbst(T,key,f,p); if(!p) { printf("没有此元素/n"); return ;} if(!p->lchild) { q=p;p=p->lchild;} else if(!p->rchild) { q=p;p=p->rchild;} else { q=p; s=p->lchild; while(s->rchild) { q=s;s=s->rchild;} if(q!=p) { q->rchild=s->lchild;} else { q->lchild=s->lchild;} p->data=s->data;q=s; } if(!f) T=p; else if(q!=s) if(key<f->data) f->lchild=p; else f->rchild=p; free(q); } void InorderTraverse(bitree T) { if(T) { InorderTraverse(T->lchild); printf("%d ",T->data); InorderTraverse(T->rchild); } } int main() { bitree T; createbst(T); InorderTraverse(T); printf("/n请输入要删除的元素/n"); int ch; scanf("%d",&ch); while(ch!=-1000) { deletebst(T,ch); printf("/n"); InorderTraverse(T); scanf("%d",&ch); } system("pause"); }

你可能感兴趣的:(二叉排序树)