




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、中序線索化二叉樹數(shù)據(jù)結(jié)構(gòu).當(dāng)用二叉鏈表作為二叉樹的存儲結(jié)構(gòu)時,因?yàn)槊總€結(jié)點(diǎn)中只有指向其左、右孩子結(jié)點(diǎn)的指 針,所以從任一結(jié)點(diǎn)出發(fā)只能直接找到該結(jié)點(diǎn)的左、右孩子。在一般情況下靠它無法直接找 到該結(jié)點(diǎn)在某種遍歷次序下的前驅(qū)和后繼結(jié)點(diǎn)。如果在每個結(jié)點(diǎn)中增加指向其前驅(qū)和后繼結(jié) 點(diǎn)的指針,將降低存儲空間的效率。與此同時,我們可以證明:在n個結(jié)點(diǎn)的二叉鏈表中含有n+1個空指針。因?yàn)楹琻個結(jié)點(diǎn)的 二叉鏈表中含有2n個指針,除了根結(jié)點(diǎn),每個結(jié)點(diǎn)都有一個從父結(jié)點(diǎn)指向該結(jié)點(diǎn)的指針, 因此一共使用了 n-1個指針,所以在n個結(jié)點(diǎn)的二叉鏈表中含有2n-(n-l)=n+1個空指針。因此,可以利用這些空指針,存放指向結(jié)點(diǎn)
2、在某種遍歷次序下的前驅(qū)和后繼結(jié)點(diǎn)的指針。這 種附加的指針稱為線索,加上了線索的二叉鏈表稱為線索鏈表,相應(yīng)的二叉樹稱為線索二叉 樹。為了區(qū)分一個結(jié)點(diǎn)的指針是指向其孩子的指針,還是指向其前驅(qū)或后繼結(jié)點(diǎn)的線索,可 在每個結(jié)點(diǎn)中增加兩個線索標(biāo)志。這樣,線索二叉樹結(jié)點(diǎn)類型定義為:LchildLtagDataRtagRchild其中:Ltag=0時,表示Lchild指向該結(jié)點(diǎn)的左孩子;Ltag=1時,表示Lchild指向該結(jié)點(diǎn)的線性前驅(qū)結(jié)點(diǎn);Rtag=0時,表示Rchild指向該結(jié)點(diǎn)的右孩子;Rtag=1時,表示Rchild指向該結(jié)點(diǎn)的線性后繼結(jié)點(diǎn);以二叉鏈表結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)所構(gòu)成的二叉鏈表作為二叉樹的存儲結(jié)
3、構(gòu),叫做線索二叉鏈表;指 向結(jié)點(diǎn)的線性前驅(qū)或者線性后繼結(jié)點(diǎn)的指針叫做線索;加上線索的二叉樹稱為線索二叉樹 對二叉樹以某種次序遍歷將其變?yōu)榫€索二叉樹的過程叫做線索化。中序線索化是指用二叉鏈表結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)建立二叉樹的二叉鏈表,然后按照中序遍歷的方法 訪問結(jié)點(diǎn)時建立線索。例如有如上圖所示二叉樹,則中序遍歷的順序是:0 / J * I + H A G【參考程序】#include #include typedef enumLink,Thread PointerTag; /*指針標(biāo)志*/typedef char DataType;typedef struct BiThreTree /*定義結(jié)點(diǎn)元素*/Po
4、interTag LTag,RTag;DataType data;struct BiThreTree *lchild,*rchild;BiThreTree;BiThreTree *pre;/*全局變量,用于二叉樹的線索化*/BiThreTree *CreateTree()/*按前序輸入建立二叉樹*/BiThreTree *T;DataType ch;scanf(%c,&ch);if(ch=#)T=NULL;elseT=(BiThreTree *)malloc(sizeof(BiThreTree);T-data=ch;T-LTag二Link;/*初始化時指針標(biāo)志均為Link*/T-RTag=Li
5、nk;T-lchild=CreateTree();T-rchild=CreateTree();return T;void InThread(BiThreTree *T)BiThreTree *p;p=T;if(p)InThread(p-lchild);if(!p-lchild) p-LTag=Thread;p-lchild=pre;if(!pre-rchild) pre-RTag=Thread;pre-rchild=p;pre=p;InThread(p-rchild);BiThreTree *InOrderThrTree(BiThreTree *T) /*中序線索化二叉樹*/ BiThreTr
6、ee *Thre;/*Thre 為頭結(jié)點(diǎn)的指針*/Thre=(BiThreTree *)malloc(sizeof(BiThreTree);Thre-lchild=T;Thre-rchild=Thre;pre=Thre;InThread(T);pre-RTag=Thread;pre-rchild=Thre;Thre-rchild=pre;return Thre;void InThrTravel(BiThreTree *Thre) /*中序遍歷二叉樹*/BiThreTree *p;p=Thre-lchild;while(p!=Thre) /*指針回指向頭結(jié)點(diǎn)時結(jié)束*/ while(p-LTag=
7、Link)p=p-lchild;printf(%4c,p-data); while(p-RTag=Thread&p-rchild!=Thre)p=p-rchild;printf(%4c,p-data);p=p-rchild;void main()BiThreTree *T,*Thre;printf(“PreOrder Create Binary Tree:n”);T=CreateTree();Thre=InOrderThrTree(T);printf(“InOrder Traverse Binary Tree:n”);InThrTravel(Thre);system(pause);【調(diào)試舉例】
8、建立二叉樹時,按先序遍歷方式輸入:“ABD#EH#I#CF#G#”,其中“#”表示空指 針。建立的二叉樹為:ABCD E F GH I程序輸出為中序遍歷線索化二叉樹的結(jié)果:DBHEIAFCG已知A、B和C為三個遞增有序的線性表,現(xiàn)要求對A表作如下操作:刪除那些既在B表中 出現(xiàn)又在C表中出現(xiàn)的元素。【實(shí)驗(yàn)步驟】試對順序表編寫實(shí)現(xiàn)上述操作的算法并上機(jī)編寫代碼,要求算法盡可能高效。在實(shí)驗(yàn)報告 中分析你的算法的時間復(fù)雜度。A表中要刪除的元素實(shí)際上就是在三個表中都存在的元素。注意這三個線性表都是遞增有 序的線性表!可以利用這一性質(zhì)減少對線性表“掃描”的趟數(shù)。3改用單鏈表作為存儲結(jié)構(gòu)編寫算法,請釋放A表中
9、無用的結(jié)點(diǎn)空間,并上機(jī)編程實(shí)現(xiàn)?!舅惴ㄋ枷搿肯葟腂和C中找出共有元素same,再從A中從當(dāng)前位置開始,凡小于same的元素均保留, 等于same的就跳過,大于same時就再找下一個same。【順序存儲結(jié)構(gòu)算法描述】void SqList_Delete(SqList&A, SqList B, SqList C)i=O;j=O;m=O;/*i指示A中元素原來的位置,m為移動后的位置*/while(iA.leng th&jB.leng th&kC.leng th)if(B.elemjC.elemk) j+;else if(B.elemjC.elemk)k+;elsesame= B.elemj;/*找
10、到了相 同元素 same*/while(B.elemj=same)j+;while(C.elemk)=same)k+;/*j,k 后移到新的元素*/while(iA.length&A.elemisame)A.elemm+=A.elemi+;/ *需要保留的元素移動到新位置*/while( iA.length&A.elemi=same)i+;/*else*/*while*/while(iA.length)A.elemm+=A.elemi+;/*A 的剩余元素重新存儲*/A.length=m;/*SqList_Delete*/【順序存儲結(jié)構(gòu)參考程序】#includemain()#defineN3/
11、*宏定義,代表數(shù)組維數(shù)*/#defineM4#defineT5int i,j,k,r,m,same;/*定義變量分別指向數(shù)組a,b,c*/int aN,bM,cT;printf(“please input numbers:n”);for (i=0;iN;i+) scanf(%d,&ai);for (j=0;jM;j+) scanf(%d,&bj);for (k=0;kT;k+)scanf(%d,&ck);i=O;j=O;m=O;k=O;/*分別賦值為0,即指向數(shù)組的第一元素*/while(iN&jM&kT)if(bjck) k+;elsesame=bj; while(bj=same)j+;wh
12、ile(ck=same)k+;while(iN&aisame)am+=ai+;while(iN&ai=same) i+;while(iN)am+=ai+;printf(a%d二,m);/*輸出刪除元素后的數(shù)組a/*for (r=0;rm-1;r+)printf(%d,ar);printf(%d,am-1);printf(n);return;【程序調(diào)試】程序運(yùn)行是屏幕顯示:please input numbers:此時輸入三組測試數(shù)據(jù),數(shù)據(jù)間用空格隔開:2 3 4回車3 4 5 6回車4 5 6 7 8回車程序輸出結(jié)果:a3 = 2,3,即刪除了數(shù)組a中即在b和c中都出現(xiàn)的元素。單鏈表存儲結(jié)構(gòu)參
13、考程序】# include # include Typedef struct LNodeint data;struct LNode *next;Lnode,*LinkLis t;/*定義鏈表節(jié)點(diǎn)的結(jié)構(gòu)*/void main ( )/*功能:建立單鏈表A,B,C,并且刪除A中均在B和C中出現(xiàn)的數(shù)據(jù)。*/Crea te Lis t (LinkLis t head);/*函 數(shù)聲明*/ListDelete (LinkList La, LinkList Lb ,LinkList Lc);Print (LinkList head);LinkList headA,headB,headC;headA=NUL
14、L;headB=NULL;headC=NULL;headA=Crea teLis t( headA);/*建立鏈表*/headB=CreateList(headB);headC=CreateList(headC);prin t(headA);/*輸出顯示鏈表數(shù)據(jù)*/print(headB);print(headC);headA二ListDelete(headA,headB,headC);/*刪除 A 中滿足條件的節(jié)點(diǎn)*/Print (headA);LinkList createList(LinkList head)/*功能:建立有頭節(jié)點(diǎn)head的數(shù)據(jù)單鏈表*/LinkList p,q;p=q=
15、(LinkList)malloc(sizeof(Lnode);printf(ninput data:n);scanf(%d,&p-data);p-next=NULL;while(p-dataO)/*建立鏈表的輸入數(shù)據(jù)必須大于0,數(shù)據(jù)輸入時以輸入任何負(fù)數(shù)作 為結(jié)束*/if(head=NULL) head=p;elseq-next=p;q=p;p=(LinkList)malloc(sizeof(Lnode);printf(ninput data:n);scanf(%d,&p-data);return head;LinkList ListDelete(LinkList La,LinkList Lb,
16、LinkList Lc)/*功能:刪除A中的有關(guān)節(jié)點(diǎn)*/LinkList pa,pb,pc,qa;pa=La;qa=La;pb=Lb;pc=Lc;while(pb&pc)if(pb-datadata)pb=pb-next;else if(pb-datapc-data)pc=pc-next;else/*首先找到B和C中都存在的數(shù)據(jù),并且定位*/f (pa-datapb-data)/*在A中找到B和C中都存在的數(shù)據(jù)*/ qa=pa;else if(pada ta=pbda ta)/*刪 除節(jié)點(diǎn)*/ qa-next=pa-next; f ree(pa);pa=qa-next;else pb=pb-n
17、ext;/*else*/*while*/return La;void print(LinkList head)/*輸出鏈表數(shù)據(jù)*/LinkList r;r=head;printf(noutput data:n);while(r!=NULL)printf(%d ,r-data);return;【實(shí)驗(yàn)分析】因?yàn)閱捂湵鞟, B, C中的元素都是遞增有序的,所以先通過遍歷B和C找到它們共同 的元素,然后再查找該元素是否也存在于A中,存在則刪除;否則再查找B和C中的下一個 相同元素。無論是順序存儲結(jié)構(gòu)還是單鏈表存儲結(jié)構(gòu),都采用一次遍歷的方式來找到即在B和C中 都出現(xiàn)的元素,故時間復(fù)雜度為 O(n)。作業(yè)
18、參考答案2007.9.271試寫出一個計(jì)算鏈表中數(shù)據(jù)元素結(jié)點(diǎn)個數(shù)的算法,其中指針P指向該鏈表的第一個結(jié)點(diǎn)。【參考算法】int ListLength_L(LinkList &L)p=L-next;i=0;while(p)p=p-next;i+;return i;2試設(shè)計(jì)實(shí)現(xiàn)在單鏈表中刪去值相同的多余結(jié)點(diǎn)的算法?!緟⒖妓惴ā縮tatus ListDelete_L(LinkList &L)p=L-next;while(p)r=p;while(q)if(q-data=p-data)r-next=q-next;free(q);q=r-next;else r=q;q=q-next;p=p-next;3有一
19、個線性表(al a2 -an),它存儲在有附加表頭結(jié)點(diǎn)的單鏈表中,寫一個算法求出該 線性表中值為x的元素的序號,若x不存在,則輸出序號0.【參考算法】int Locate_L(LinkList L,int x)k=1;for (p=L-next;p&p-data!=x;p=p-next)k+;if(knext;q=p-next;s=q-next;p-next=NULL;while(s-next)q-next=p;p=q;q=s;s=s-next;q-next=p;s-next=q;L-next=s;5.在一個非遞減有序線性表中,插入一個值為x的元素,使插入后的線性表仍為非遞減有序 的,分別用向
20、量和單鏈表編寫算法。【參考算法】向量算法:status Insert_SqList(SqList &va,int x)if(va.length+1va.listsize) return error;va.length+;for(i=va.length-1;va.elemix&i=0;i-)va.elemi+1=va.elemi;va.elemi+1=x;retrun ok;單鏈表算法:status Insert_LinkList(LinkList &L)while(p &p-datanext;q=(LinkList)malloc(sizeof(LNode);q-data=x;q-next=p;r-next=q;rerurn ok;6將兩個遞增有序的線性表歸并成一個非遞增有序表?!緟⒖妓惴ā縱oid MergeList_L(LinkList &La,LinkList &Lb,LinkList
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園保健知識培訓(xùn)課件
- 金昌電梯裝修施工方案
- 干部法律知識培訓(xùn)課件
- 水塔工程施工方案
- 兒童租賃門店合同范例
- 個人勞務(wù)派遣工合同范例
- 個人田地出租合同范例
- 人工代加工合同范例
- 品牌引導(dǎo)消費(fèi)者行為的技巧計(jì)劃
- 秘書工作任務(wù)安排計(jì)劃表
- 電影院管理與運(yùn)營服務(wù)流程手冊
- 8.2 二氧化碳的性質(zhì)和用途 同步練習(xí)
- GB/T 44536-2024CVD陶瓷涂層熱膨脹系數(shù)和殘余應(yīng)力試驗(yàn)方法
- 現(xiàn)代家政導(dǎo)論-課件 6.1.1認(rèn)識道德與職業(yè)道德
- 北京市東城區(qū)2022-2023學(xué)年高三上學(xué)期期末考試地理試卷 含答案
- 深圳益電通變頻器說明書TD90
- 人教版初中八年級物理上冊課件-第1章-機(jī)械運(yùn)動
- 《中小型無人駕駛航空器垂直起降場技術(shù)要求》編制說明
- 國有企業(yè)內(nèi)部控制的問題與改進(jìn)措施
- 企業(yè)員工健康管理與關(guān)懷計(jì)劃實(shí)施方案
- 爭做“四有好老師”-當(dāng)好“四個引路人”
評論
0/150
提交評論