先序遍历递归算法详解c语言,二叉树先序递归算法(C语言)

这是我同学一个完整的程序。#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 。具体的算法思想是什么。

展开

全部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值