首页 二叉树遍历

二叉树遍历

举报
开通vip

二叉树遍历 二 叉 树 基 本 操 作 的 程 序 实 现 //Bintree.h #include #include typedef struct Binnode{//二叉树结点结构体 char data; struct Binnode *lchild; struct Binnode *rchild; }; typedef Binnode *Bintree ; typedef struct stack{ //二叉树结点栈 Bintree data[1...

二叉树遍历
二 叉 树 基 本 操 作 的 程 序 实 现 //Bintree.h #include #include typedef struct Binnode{//二叉树结点结构体 char data; struct Binnode *lchild; struct Binnode *rchild; }; typedef Binnode *Bintree ; typedef struct stack{ //二叉树结点栈 Bintree data[100]; int flag[100]; int top; }; typedef struct queue{ //二叉树结点队列 Bintree data[30]; int front; int rear; }; /*******************************************/ /* 按照前序遍历建立二叉树 */ /*******************************************/ void Creat_Bintree(Bintree *root) { char ch; if((ch=getchar())==' ') { *root=NULL; } else { *root=(Binnode*)malloc(sizeof(Binnode)); (*root)->data=ch; Creat_Bintree(&(*root)->lchild); Creat_Bintree(&(*root)->rchild); } PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn } /*******************************************/ /* 按照前序递归遍历二叉树 */ /*******************************************/ void Preorder1(Bintree t) { if(t!=NULL) { printf("%c",t->data); Preorder1(t->lchild); Preorder1(t->rchild); } } /*******************************************/ /* 按照中序递归遍历二叉树 */ /*******************************************/ void Inorder1(Bintree t) { if(t!=NULL) { Inorder1(t->lchild); printf("%c",t->data); Inorder1(t->rchild); } } /*******************************************/ /* 按照后序递归遍历二叉树 */ /*******************************************/ void Posorder1(Bintree t) { if(t!=NULL) { Posorder1(t->lchild); Posorder1(t->rchild); printf("%c",t->data); } } PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn /*******************************************/ /* 按照前序非递归遍历二叉树 */ /*******************************************/ void Preorder2(Bintree t) { Bintree pre=t; stack s; s.top=0; printf("输出前序遍历序列:"); while(pre||s.top>0) { if(pre) { printf("%c",pre->data); s.data[s.top++]=pre; pre=pre->lchild; } else { pre=s.data[--s.top]->rchild; } } printf("\n\n"); } /*******************************************/ /* 按照中序非递归遍历二叉树 */ /*******************************************/ void Inorder2(Bintree t) { Bintree pre=t; stack s; s.top=0; printf("输出中序遍历序列:"); while(pre||s.top>0) { if(pre) { s.data[s.top++]=pre; pre=pre->lchild; } else PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn { pre=s.data[--s.top]; printf("%c",pre->data); pre=pre->rchild; } } printf("\n\n"); } /*******************************************/ /* 按照后序非递归遍历二叉树 */ /*******************************************/ void Posorder2(Bintree t) { stack s; s.top=-1; printf("输出后序遍历序列:"); while(t!=NULL||s.top!=-1) { while(t) { s.top++; s.flag[s.top]=0; s.data[s.top]=t; t=t->lchild; } while(s.top>=0&&s.flag[s.top]==1) { t=s.data[s.top]; printf("%c",t->data); s.top--; } if(s.top>=0) { t=s.data[s.top]; s.flag[s.top]=1; t=t->rchild; } else { t=NULL; } PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn } printf("\n\n"); } /*******************************************/ /* 按照层次遍历二叉树 */ /*******************************************/ void Levelorder(Bintree t) { queue q; q.data[0]=t; q.front=0;q.rear=1; printf("层次遍历二叉树结果:"); while(q.frontdata); q.data[q.rear++]=q.data[q.front]->lchild; q.data[q.rear++]=q.data[q.front]->rchild; q.front++; } else { q.front++; } } printf("\n\n"); } #include"Bintree.h" /*******************************************/ /* 递归法将二叉树的左右子树互换 */ /*******************************************/ void Exchange1(Bintree t) { Bintree temp; if(t) { Exchange1(t->lchild); PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn Exchange1(t->rchild); temp=t->lchild; t->lchild=t->rchild; t->rchild=temp; } } /*******************************************/ /* 非递归法将二叉树的左右子树互换 */ /*******************************************/ void Exchange2(Bintree t) { Bintree temp; stack s; s.top=0; while(t||s.top) { if(t) { s.data[s.top++]=t; temp=t->lchild; t->lchild=t->rchild; t->rchild=temp; t=t->lchild; } else { t=s.data[--s.top]->rchild; } } } int main() { Bintree t; Creat_Bintree(&t); Exchange2(t); Inorder2(t); return 0; } #include"Bintree.h" /*******************************************/ PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn /* 递归法求叶子结点个数 */ /*******************************************/ int Leaves_Num1(Bintree t) { if(t) { if(t->lchild==NULL&&t->rchild==NULL) { return 1; } return Leaves_Num1(t->lchild)+Leaves_Num1(t->rchild); } return 0; } /*******************************************/ /* 非递归法求叶子结点个数 */ /*******************************************/ int Leaves_Num2(Bintree t) { int count=0; stack s; s.top=0; while(t||s.top>0) { if(t) { s.data[s.top++]=t; if(t->lchild==NULL&&t->rchild==NULL) { count++; } t=t->lchild; } else { t=s.data[--s.top]->rchild; } } return count; } PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn int main() { int count=0; Bintree t; Creat_Bintree(&t); count=Leaves_Num2(t); printf("该二叉树的叶子结点数为:%d\n",count); return 0; } #include"Bintree.h" /**********************************************/ /* 求一棵树的高度 */ /**********************************************/ int Depth(Bintree t) { int lh , rh ; if( NULL == t ) { return 0 ; } else { lh = Depth( t->lchild ) ; rh = Depth( t->rchild ) ; return ( lh > rh ? lh : rh ) + 1 ; } } int main() { Bintree t ; Creat_Bintree( &t ) ; printf( "树的高度是%d\n" , Depth( t ) ) ; return 0 ; } PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn #include"Bintree.h" /*******************************************************/ /* 已知一课棵二叉树的中序和后序,建立这棵树 */ /*******************************************************/ void In_Pos_order(Bintree *t,char *s,char *r) { char La[30],Lb[30],Ra[30],Rb[30]; int i,len,length=strlen(r); if(length>0&&r[length-1]!='\0') { *t=(Binnode *)malloc(sizeof(Binnode)); (*t)->data=r[length-1]; for(i=0;s[i]!=r[length-1];i++) { Ra[i]=s[i]; La[i]=r[i]; } len=i; Ra[len]='\0'; //左中 La[len]='\0'; //左后 for(i=len+1;ilchild,Ra,La); In_Pos_order(&(*t)->rchild,Rb,Lb); } else { *t=NULL; } } int main() { Bintree t; char in[30]="ABCEFGHD",pos[30]="ABFHGEDC";//测试数据 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn printf("输入中序遍历序列:"); scanf("%s",in); printf("输入后序遍历序列:"); scanf("%s",in); In_Pos_order(&t,in,pos); Preorder2(t); } #include"Bintree.h" /*******************************************************/ /* 判断两棵是否等价 */ /*******************************************************/ int Is_equal( Bintree t1 , Bintree t2 ) { int t=0; if(NULL == t1 && NULL == t2) { t=1; } else { if(NULL !=t1 &&NULL != t2 ) { if(t1->data == t2->data) { if(Is_equal(t1->lchild,t2->lchild)) { t=Is_equal(t1->rchild,t2->rchild); } } } } return t; } int main() { Bintree t1,t2; Creat_Bintree(&t1); getchar(); Creat_Bintree(&t2); PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn if(Is_equal(t1,t2)) { printf( "Yes!\n") ; } else { printf( "No!\n" ) ; } return 0 ; } #include"Bintree.h" /****************************************************/ /* 查找某个信息是否在这棵树中 */ /****************************************************/ Bintree locale_x(Bintree t,char x) { Bintree p; if(t==NULL) return NULL; else { if( t -> data == x ) return t; else { p = locale_x(t->lchild,x); if(p)return p; else return locale_x(t->rchild,x); } } } int main() { Bintree root,p; char ch; Creat_Bintree(&root); getchar(); printf("输入要查找的值:"); PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn scanf("%c",&ch); p=locale_x(root,ch); if(p)printf( "YES!\n" ) ; else printf( "NO!\n" ) ; return 0; } #include"Bintree.h" /****************************************************/ /* 树的结点个数 */ /****************************************************/ int num_of_node(Bintree t) { if(t==NULL)return 0 ; else return num_of_node(t->lchild)+num_of_node(t->rchild)+1; } int main() { Bintree root,p; Creat_Bintree(&root); printf("%d\n",num_of_node(root)); return 0; } #include"Bintree.h" /*******************************************************/ /* 已知一课棵二叉树的中序和前序序列,建立这棵树 */ /*******************************************************/ void Pre_In_order(Bintree *t,char *s,char *r) { char La[30],Lb[30],Ra[30],Rb[30]; int i,len; if(s[0]!='\0') { *t=(Binnode *)malloc(sizeof(Binnode)); PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn (*t)->data=s[0]; for(i=0;r[i]!=s[0];i++) { Ra[i]=r[i]; } len=i; Ra[len]='\0'; //左中 for(i=0;ilchild,La,Ra); Pre_In_order(&(*t)->rchild,Lb,Rb); } else { *t=NULL; } } int main() { Bintree t; char pre[30]="ABCDEF",in[30]="CBAEDF";//测试数据 printf("输入前序遍历序列:"); scanf("%s",pre); printf("输入中序遍历序列:"); scanf("%s",in); Pre_In_order(&t,pre,in); Posorder1(t); } PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn #include #include typedef struct node{ int data; struct node *lchild,*rchild,*next; }hufnode; typedef hufnode *linkhuf; /****************************************************/ /* huffman树 */ /****************************************************/ linkhuf Creat_Node(int n) //创建一单链 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf { linkhuf head,pre,p; int x; head=NULL; while(n--) { scanf("%d",&x); p=(linkhuf)malloc(sizeof(hufnode)); p->data=x; p->lchild=NULL; p->rchild=NULL; if(NULL==head) { head=p; pre=head; } else { p->next=pre->next; pre->next=p; pre=pre->next; } } return head; } linkhuf insert(linkhuf root , linkhuf s)//将结点 S插入到有序 Huffman root中。 { linkhuf p1,p2; if(NULL == root ) root=s; else { PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn p1=NULL; p2=root; while(p2&&p2->datadata) { p1=p2; p2=p2->next; } s->next=p2; if(NULL==p1) { root=s; } else { p1->next=s; } } return root; } void Preorder1(linkhuf t) { if(t!=NULL) { printf("%-6d",t->data); Preorder1(t->lchild); Preorder1(t->rchild); } } void creathuffman(linkhuf *root)//构造 Huffman树。 { linkhuf s, rl,rr; while(*root && (*root)->next) { rl=*root; rr=(*root)->next; *root=rr->next; s=(linkhuf)malloc(sizeof(hufnode)); s->next=NULL; s->data=rl->data+rr->data; s->lchild=rl; s->rchild=rr; rl->next=rr->next=NULL; PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn *root=insert(*root,s); } } int main() { linkhuf root; int n; scanf("%d",&n); root=Creat_Node(n); creathuffman(&root); Preorder1(root); printf("\n"); return 0; } ************************************************************/ /* 按层次顺序建立一棵二叉树 */ /************************************************************/ #include"Bintree.h" Bintree Level_Creat() { Bintree root,p,s; queue node; node.front=node.rear=0; char ch; ch=getchar(); if(ch==' ') { return NULL; } root=(Binnode*)malloc(sizeof(Binnode)); //生成根结点 root->data=ch; node.data[node.rear++]=root; //用队列实现层次遍历 while(node.frontdata=ch; p->lchild=s; node.data[node.rear++]=s; } else { p->lchild=NULL; } ch=getchar(); if(ch!=' ') { s=(Binnode*)malloc(sizeof(Binnode)); s->data=ch; p->rchild=s; node.data[node.rear++]=s; } else { p->rchild=NULL; } } return root; } int main() { Bintree root; root=Level_Creat(); Inorder1(root);//测试,中序遍历 return 0; } PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
本文档为【二叉树遍历】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_000633
暂无简介~
格式:pdf
大小:52KB
软件:PDF阅读器
页数:17
分类:理学
上传时间:2012-12-30
浏览量:21