这是我同学一个完整的程序。#include#includetypedef struct tree{char data[10]; struct tree *lchild,*rchild;}TREE;
void create(TREE **t);void postorder
这是我同学一个完整的程序。#include#includetypedef struct tree{char data[10]; struct tree *lchild,*rchild;}TREE;
void create(TREE **t);void postorder(TREE **t);int insert(TREE **t,TREE **ins);int delete(TREE **t,char del[100]);
main(){ TREE *t,*ins,*r; int n,m; char del[100]; clrscr(); printf("input data(# is null):"); create(&t); do{ printf("
the data:"); postorder(&t); printf("
1 -- insert;2 -- delete;3 -- exit;
");scanf("%d",&n); if (n==1) { ins=(TREE *)malloc(sizeof(TREE)); printf("input a data:"); scanf("%s",ins->data); ins->lchild=ins->rchild=NULL; m=insert(&t,&ins); if(m==1) {ins->lchild=t;r=ins;ins=t;t=r; while(ins->lchild!=NULL) {r->rchild=ins->rchild; r=r->lchild;ins=ins->lchild;} m=2;} else if(m==3){r=t; while(r->rchild!=NULL) r=r->rchild; r->rchild=ins;m=2;} } else if (n==2) { printf("input a data:"); scanf("%s",del); m=delete(&t,del); if(m==1){ ins=t;t=t->lchild;r=t; while(r->rchild!=NULL) r=r->rchild; r->rchild=ins->rchild; free(ins); m=2;} else if(m==3) {printf(" no find!");m=2;} } if(n==3) exit(0);
}while(m==2); }
void create(TREE **t){*t=(TREE *)malloc(sizeof(TREE)); do{scanf("%s",(*t)->data);}while(strcmp((*t)->data,"")==0); if(strcmp((*t)->data,"#")==0){free(*t);*t=NULL;} else { create(&(*t)->lchild); create(&(*t)->rchild);} }
void postorder(TREE **t){ printf(" %s",(*t)->data); if((*t)->lchild!=NULL) postorder(&(*t)->lchild); if((*t)->rchild!=NULL) postorder(&(*t)->rchild); }
int insert(TREE **t,TREE **ins){ int n=0;TREE *q; if(strcmp((*t)->data,(*ins)->data)>=0) return(1);
if((*t)->lchild!=NULL) n=insert(&(*t)->lchild,&(*ins)); if(n==1){ (*ins)->lchild=(*t)->lchild;(*t)->lchild=*ins; q=*t; while((*ins)->lchild!=NULL) {*ins=(*ins)->lchild; q=q->lchild; q->rchild=(*ins)->rchild;(*ins)->rchild=NULL;} return(2);} else if(n==2)return(2);
if((*t)->rchild!=NULL) n=insert(&(*t)->rchild,&(*ins)); if(n==1){ (*ins)->lchild=(*t)->rchild;(*t)->rchild=*ins; *ins=(*ins)->lchild;*t=(*t)->rchild; (*t)->rchild=(*ins)->rchild; (*ins)->rchild=NULL; q=*t; while((*ins)->lchild!=NULL) {*ins=(*ins)->lchild;q=q->lchild; q->rchild=(*ins)->rchild;(*ins)->rchild=NULL;} return(2);} else if(n==2) return(2); return(3);}
int delete(TREE **t,char del[100]){int n=0;TREE *q,*p;
if(strcmp((*t)->data,del)==0) return(1); if ((*t)->lchild!=NULL) n=delete(&(*t)->lchild,del); if(n==1){ q=(*t)->lchild; if(q->lchild!=NULL){ if(q->rchild!=NULL){p=(*t)->lchild=q->lchild; while(p->rchild!=NULL) p=p->rchild; p->rchild=q->rchild; free(q);} else {(*t)->lchild=q->lchild; free(q);}} else if(q->rchild!=NULL){ (*t)->lchild=q->rchild; free(q);} else free(q); return(2);} else if(n==2) return(2);
if ((*t)->rchild!=NULL) n=delete(&(*t)->rchild,del); if(n==1){q=(*t)->rchild; if(q->lchild!=NULL){ if(q->rchild!=NULL){p=(*t)->rchild=q->lchild; while(p->rchild!=NULL) p=p->rchild; p->rchild=q->rchild; free(q);} else {(*t)->rchild=q->lchild; free(q);}} else if(q->rchild!=NULL){ (*t)->rchild=q->rchild; free(q);} else free(q); return(2);} else if(n==2) return(2); return(3);}
1.创建时候,void create(TREE **t); 用了指向指针的指针。请问这是什么意思?为什么有地方用*t,有地方用**t呢?2.在主函数里,调用create(&t); 为什么括号里面有“&”?3.假设已有1 3 5 (先序)的二叉树。要增加一个数据,使得加入的数据按先序遍历后仍然符合其大小关系。例如,插入6,先序遍历就是1 3 5 6。插入2 就是1 2 3 5 。具体的算法思想是什么。
展开
全部