数据结构(三)打印二叉树中结点层次遍历序列的实现
1.實(shí)驗(yàn)?zāi)康?#xff1a;
掌握二叉樹(shù)的結(jié)構(gòu)特性以及二叉鏈表的存儲(chǔ)結(jié)構(gòu)的特點(diǎn)及適用范圍。同時(shí),掌握用指針類型描述、訪問(wèn)和處理二叉樹(shù)的運(yùn)算。
2.試驗(yàn)問(wèn)題:
建立一棵二叉樹(shù),按層次遍歷該二叉樹(shù),并顯示出這棵二叉樹(shù)。要求:以二叉鏈表作為存儲(chǔ)結(jié)構(gòu),按層次遍歷創(chuàng)建一棵二叉樹(shù),從鍵盤接收輸入結(jié)點(diǎn),用“A”,“B”,“C”,…來(lái)表示非空結(jié)點(diǎn),用“*”來(lái)表示空結(jié)點(diǎn),以“#”號(hào)結(jié)束,對(duì)此二叉樹(shù)進(jìn)行層次遍歷并將遍歷結(jié)果輸出。
3.解題思路:
非遞歸層次遍歷二叉樹(shù)的算法基本思想:由層次遍歷的定義可知,層次遍歷是從根結(jié)點(diǎn)開(kāi)始訪問(wèn),然后訪問(wèn)它的左孩子和右孩子,接下來(lái)是它左孩子的左孩子和右孩子,右孩子的左孩子和右孩子,……,在訪問(wèn)完某個(gè)結(jié)點(diǎn)后,一般不能馬上訪問(wèn)它的左孩子和右孩子(除根結(jié)點(diǎn)等特殊情況外),需要把它的左右孩子信息保存起來(lái)。這種方式正好與隊(duì)列的操作特點(diǎn)吻合,所以可利用一個(gè)隊(duì)列結(jié)構(gòu)來(lái)實(shí)現(xiàn)層次遍歷,其做法是:
1)首先將根結(jié)點(diǎn)入隊(duì)列;
2)當(dāng)隊(duì)列不空,從對(duì)列中取出對(duì)頭結(jié)點(diǎn)訪問(wèn)它,并在其左右孩子非空時(shí),把它的左孩子和右孩子結(jié)點(diǎn)依次入隊(duì)列;
3)反復(fù)執(zhí)行同樣操作,直到隊(duì)列為空時(shí)止。
用一維數(shù)組queue[MAXSIZE]實(shí)現(xiàn)循環(huán)隊(duì)列,變量front和rear為分別表示對(duì)頭指針和隊(duì)尾指針的指示器變量,并假定隊(duì)列有足夠的空間不會(huì)發(fā)生上溢。
4.程序?qū)崿F(xiàn):
#include "stdio.h" #include "malloc.h" #include "conio.h" #define MAXSIZE 100 typedef char elemtype;typedef struct btnode {elemtype data;struct btnode *lchild,*rchild; }bitnode,*bitree;typedef struct nodd {bitree addr;int parent; }sequre;bitree ins_node(bitree s,bitree t); void print_tree(bitree t); bitree create_ordbt(); sequre seq[MAXSIZE]; int n=0;bitree create_ordbt() {bitree t,s;elemtype x;t=NULL;printf("請(qǐng)按層次順序輸入結(jié)點(diǎn)1的值(以#號(hào)結(jié)束,*號(hào)為空的結(jié)點(diǎn)):\n");scanf("%c",&x);getchar();while(x!='#'){n++;if(x!='*'){s=(bitree)malloc(sizeof(bitnode));s->data=x;s->lchild=NULL;s->rchild=NULL;seq[n].addr=s;t=ins_node(s,t);}elseseq[n].addr=NULL;printf("請(qǐng)輸入結(jié)點(diǎn)%d的值(以#號(hào)結(jié)束,*號(hào)為空結(jié)點(diǎn)):\n",n+1);x=getche();getchar();}return t; }bitree ins_node(bitree s,bitree t) {int kk;if(n==1)t=s;else{kk=n/2;if(n%2==0)seq[kk].addr->lchild=s;elseseq[kk].addr->rchild=s;}return t; }void print_tree(bitree t) {int i,j,k,nn,start,head,rear;sequre seqq[MAXSIZE];bitree p;if(t==NULL)return;head=0;nn=rear=0;seqq[rear].addr=t;for(;head<=rear && nn<MAXSIZE; head++){p=seqq[head].addr;if(p->lchild!=NULL)seqq[++rear].addr=p->lchild;if(p->rchild!=NULL)seqq[++rear].addr=p->rchild;}for(head=0,j=1,k=1;head <=rear;){printf("\n第%d層數(shù)據(jù):",j);for(i=0,start=head;head<start+k;head++){printf("%c ",seqq[head].addr->data);if(seqq[head].addr->lchild==NULL)i=i-1;if(seqq[head].addr->rchild==NULL)i=i-1;}k=k*2+i;j++;} }main() {bitree tree;tree=create_ordbt();print_tree(tree); }5.測(cè)試數(shù)據(jù):
總結(jié)
以上是生活随笔為你收集整理的数据结构(三)打印二叉树中结点层次遍历序列的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 这半年,蔡崇信、张勇、彭蕾、井贤栋是怎么
- 下一篇: 【计算机科学】【2011.05】【含源码