版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、二叉樹中所有節(jié)點(diǎn)的左右子樹相互交換 遞歸與非遞歸程序(2006-10-11 11:24:09) 轉(zhuǎn)載分類: 數(shù)據(jù)結(jié)構(gòu) /將二叉樹中所有節(jié)點(diǎn)的左右子樹相互交換BiNode* Exchange(BiNode* T) BiNode* p; if(NULL=T | (NULL=T->lchild && NULL=T->rchild) return T; p = T->lchild; T->lchild = T->rchild; T->rchild = p; i
2、f(T->lchild) T->lchild = Exchange(T->lchild); if(T->rchild) T->rchild = Exchange(T->rchild); return T;/將二叉樹中所有節(jié)點(diǎn)的左右子樹相互交換/不使用遞歸void NonRecursive_Exchange(BiNode* T) Stack s; BiNode* p; if(NULL=T) retu
3、rn; InitStack(&s); Push(&s,T); while(!isEmpty(&s) T = Pop(&s); p = T->lchild; T->lchild = T->rchild; T->rchild = p; if(T->rchild) Push(&s,T->rchild); if
4、(T->lchild) Push(&s,T->lchild); DestroyStack(&s); /遞推形式的前續(xù)遍歷,不使用遞歸和堆棧,/但每個(gè)節(jié)點(diǎn)增加了一個(gè)parent指針和Mark標(biāo)記void Iteration_Mark_PreOrderTraverse(BiPMNode* T) if(NULL = T) return; while(NULL != T) if(0 =
5、T->mark) T->mark +; printf("%d ",T->data); while(NULL != T->lchild) T = T->lchild; T->mark +;
6、0;printf("%d ",T->data); T->mark +; if(NULL != T->rchild) T = T->rchild; continue; if(1 = T->mark) T->mark +; &
7、#160;if(NULL != T->rchild) T = T->rchild; continue; if(2 = T->mark) T = T->parent; /遞推形式的中續(xù)遍歷,不使用遞歸和堆棧,/但每個(gè)節(jié)點(diǎn)增加了一個(gè)paren
8、t指針和Mark標(biāo)記void Iteration_Mark_InOrderTraverse(BiPMNode* T) if(NULL = T) return; while(NULL != T) if(0 = T->mark) T->mark +; while(NULL != T->lchild)
9、; T = T->lchild; T->mark +; printf("%d ",T->data); T->mark +; if(NULL != T->rchild) T = T
10、->rchild; continue; if(1 = T->mark) printf("%d ",T->data); T->mark +; if(NULL != T->rchild) T = T->rchild; cont
11、inue; if(2 = T->mark) T = T->parent; /遞推形式的后續(xù)遍歷,不使用遞歸和堆棧,/但每個(gè)節(jié)點(diǎn)增加了一個(gè)parent指針和Mark標(biāo)記void Iteration_Mark_PostOrderTraverse(BiPMNode* T) if(NULL = T) return;&
12、#160; while(NULL != T) if(0 = T->mark) T->mark +; while(NULL != T->lchild) T = T->lchild; T->mark +;
13、; T->mark +; if(NULL != T->rchild) T = T->rchild; continue; if(1 = T->mark) T->mark +; if(NULL != T->rchild) T = T-&
14、gt;rchild; continue; if(2 = T->mark) printf("%d ",T->data); T = T->parent; 二叉樹 層次遍歷(2006-10-10 11:12:31) 轉(zhuǎn)載分類: 數(shù)據(jù)結(jié)構(gòu) /二叉樹的層次遍
15、歷,使用隊(duì)列實(shí)現(xiàn)void LayerOrderTraverse(BiNode* T) Queue q; if(NULL = T) return; InitQueue(&q); EnQueue(&q,T); while(!isQueueEmpty(&q) T = DeQueue(&q); printf("%d ",T->data); if(T->lchild)&
16、#160; EnQueue(&q,T->lchild); if(T->rchild) EnQueue(&q,T->rchild); DestroyQueue(&q); typedef struct _QNode BiNode* data; struct _QNode* next;QNode;typedef struct _queue QNode* front; QNode* rear;Queu
17、e;void InitQueue(Queue* q) q->front = q->rear = (QNode*)malloc(sizeof(QNode); q->front->next = NULL;bool isQueueEmpty(Queue* q) if(q->front = q->rear) return true; else return false;void EnQueue(Queue* q, BiNode* data) QNode* pNo
18、de; pNode = (QNode*)malloc(sizeof(QNode); pNode->data = data; pNode->next = NULL; q->rear->next = pNode; q->rear = pNode;BiNode* DeQueue(Queue* q) QNode* pNode; BiNode* pData; assert(q->front != q->rear); pNode = q->front->next;
19、 q->front->next = pNode->next; if(q->rear = pNode) q->rear = q->front; pData = pNode->data; free(pNode); return pData;void DestroyQueue(Queue* q) while(NULL != q->front) q->rear = q->front->next;
20、160; free(q->front); q->front = q->rear; 二叉排序樹-創(chuàng)建(2006-10-10 10:05:04) 轉(zhuǎn)載分類: 數(shù)據(jù)結(jié)構(gòu) typedef struct BiNode int data; struct BiNode *lchild; struct BiNode *rchild;BiNode; BiNode* Insert(BiNode* T, int data) if(NULL = T)
21、0; T = (BiNode*)malloc(sizeof(BiNode); T->data = data; T->lchild = NULL; T->rchild = NULL; return T; if(data <= T->data) T->lchild = Insert(T->lchild, data); else T->rchild = Insert(T-&
22、gt;rchild, data); return T; /創(chuàng)建一個(gè)二叉排序樹, input -1 to endBiNode* createBiSortTree() BiNode *root = NULL; int data; while(1) scanf("%d",&data); if(-1 = data) break; root = Insert(root, data); retu
23、rn root;查看文章 交換二叉樹所有節(jié)點(diǎn)的左右子樹 2010-12-03 21:44/實(shí)驗(yàn)題目:已知二叉樹以二叉鏈表作為存儲(chǔ)結(jié)構(gòu),寫一個(gè)算法來交換二叉樹的所有節(jié)點(diǎn)的左右子樹/先建立二叉樹的二叉鏈表存儲(chǔ)結(jié)構(gòu),再完成算法,注意結(jié)果的輸出形式#include <stdio.h>#include <malloc.h>#include <windows.h>#define STACK_INIT_SIZE 100;#define STACKINCREMENT 10;/定義二叉樹數(shù)據(jù)類型typedef char TElemtype;typedef struct BiT
24、Node TElemtype data;struct BiTNode *lchild,*rchild;BiTNode,*BiTree;/-二叉樹基本操作-/初始化二叉樹bool InitBiTree(BiTree &T)T=(BiTree)malloc(sizeof(BiTNode);T->data=NULL;T->lchild=NULL;T->rchild=NULL;return true;/創(chuàng)建二叉樹void CreateBiTree(BiTree &T) TElemtype c=
25、39; 'c=getchar();getchar();if(c=' ') T=NULL;else InitBiTree(T); T->data=c; CreateBiTree(T->lchild); CreateBiTree(T->rchild);/操作函數(shù)-輸出bool Visit(TElemtype e)if(e
26、!=NULL) printf("%c ",e); return true;else return false;/先序遍歷二叉樹bool PreOrderTraverse(BiTree T,bool Visit(TElemtype) if(T) if(Visit(T->data) if (PreOrderTr
27、averse(T->lchild,Visit) if (PreOrderTraverse(T->rchild,Visit) return true; return false;else ret
28、urn true;/-/定義棧的數(shù)據(jù)類型typedef structTElemtype *base;TElemtype *top;int stacksize;SqStack;/交換左右子樹void exchange(BiTree &rt)BiTree temp = NULL;if(rt->lchild = NULL && rt->rchild = NULL) return;else temp = rt-&
29、gt;lchild; rt->lchild = rt->rchild; rt->rchild = temp;if(rt->lchild) exchange(rt->lchild);if(rt->rchild) exchange(rt->rchild);/-Main函數(shù)-void main()B
30、iTree T; MessageBox(NULL,"請(qǐng)按照先序遍歷輸入二叉樹!","提示",MB_OK|MB_ICONWARNING);MessageBox(NULL,"請(qǐng)輸入數(shù)據(jù)!(空格表示結(jié)束)","提示",MB_OK|MB_ICONWARNING);CreateBiTree(T);MessageBox(NULL,"輸入結(jié)束!","提示",MB_OK|MB_ICONWARNING);printf("n按先序輸出n")
31、;PreOrderTraverse(T,Visit);MessageBox(NULL,"輸出結(jié)束!","提示",MB_OK|MB_ICONWARNING); printf("n交換后n");exchange(T); PreOrderTraverse(T,Visit);窗體頂端隨筆- 8 文章- 4 評(píng)論- 0 二叉樹左右子樹交換(麻煩)/*對(duì)任意一顆二叉樹,是將其說有結(jié)點(diǎn)的左右子樹交換,并將交換前后不同二叉樹分別用層序、前序,中序三
32、種不同的方法進(jìn)行遍歷。算法描述:分四步 (1) 創(chuàng)建二叉樹 用遞歸的方法創(chuàng)建樹根結(jié)點(diǎn),然后分別創(chuàng)建左右子樹。在創(chuàng)建二叉樹時(shí)結(jié)點(diǎn)可以提前確定,也可以不確定,有數(shù)據(jù)輸入控制。此方法中樹的節(jié)點(diǎn)有輸入端輸入,然后再輸入一個(gè)字符串,然后從字符串中讀入數(shù)據(jù)創(chuàng)建二叉樹。(2)用三種不同的方法遍歷交換前的二叉樹。層次遍歷,先根遍歷,中跟遍歷。層次遍歷用一個(gè)指針棧來實(shí)現(xiàn)。另外兩種方法用遞歸即可。(3)交換二叉樹中所有的結(jié)點(diǎn)的左右子樹。交換過程中需要用一個(gè)指針站來實(shí)現(xiàn)。(4)遍歷二叉樹。實(shí)現(xiàn)過程跟第二步差不多。*/#include<stdio.h>#include<stdli
33、b.h>#define max 20/定義樹的結(jié)點(diǎn)數(shù) #define null 0typedef struct btnode/定義二叉樹結(jié)點(diǎn)類型 char date;/結(jié)點(diǎn)數(shù)據(jù)類型 struct btnode *lc,*rc;/左右指針 bttree;bttree *createtree(char *str,int i,int m)/將字符串str中第i到第m個(gè)字符創(chuàng)建樹 bttree *p; if(i>=m) return null; p=(
34、bttree*)malloc(sizeof(bttree);/生成新結(jié)點(diǎn) p->date=stri;/將結(jié)點(diǎn)的第一個(gè)數(shù)據(jù)付給根 p->lc=createtree(str,2*i+1,m);/創(chuàng)建左子樹 p->rc=createtree(str,2*i+2,m);/創(chuàng)建右子樹 return (p); bttree *jiaohuan(bttree *p)/將p指針指向的二叉樹的左右子樹進(jìn)行互換。 bttree *stackmax;/指針類型的堆棧 int k; k=0;
35、60;stackk=null; if(p!=null)/交換p結(jié)點(diǎn)的左右孩子 k+; stackk=p->lc; p->lc=p->rc; p->rc=stackk; p->lc=jiaohuan(p->lc); p->rc=jiaohuan(p->rc); return (p); void xiangen(bttree *t)/先跟遍歷 &
36、#160;if(t!=null) printf("%c",t->date); if(t->lc) printf("->"); xiangen(t->lc); if(t->rc) printf("->");
37、xiangen(t->rc); void zhonggen(bttree *p)/中根遍歷即中序遍歷 if(p!=null) zhonggen(p->lc); printf("%c",p->date); printf("->"); zhonggen(p->rc); void cengci(bttree
38、*t,int m)/按層次遍歷 bttree *queuemax; bttree *p; int front=0,rear=0,i; queuerear+=t; while(front!=rear) p=queuefront; front=(front+1)%m; printf("%c->",p->date);/輸出根結(jié)點(diǎn) if(p->lc!=null)/遍歷左子樹 if(rear+1)%m!=front) queuerear=p->lc; rear=(rear+1)%m; if(p->rc!=null)/遍歷右子樹 if(rear+1)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度“魔百和”虛擬現(xiàn)實(shí)游戲內(nèi)容合作授權(quán)合同3篇
- 二零二五年度電商平臺(tái)虛擬貨幣交易風(fēng)險(xiǎn)管理合同4篇
- 2025年度美甲店員工福利保障與激勵(lì)方案合同4篇
- 二零二五年度度假村整棟經(jīng)營管理合同4篇
- 2025年度農(nóng)業(yè)種植與農(nóng)業(yè)人才培養(yǎng)合作合同4篇
- 2025年度個(gè)人汽車租賃價(jià)格調(diào)整合同
- 2025年度農(nóng)產(chǎn)品電商渠道合作框架協(xié)議4篇
- 2025年度個(gè)人旅游保險(xiǎn)代理銷售合同8篇
- 2025年度個(gè)人自用住房地基買賣協(xié)議4篇
- 二零二五年度離婚案件中關(guān)于2024年車輛分割及補(bǔ)償協(xié)議3篇
- 2024年供應(yīng)鏈安全培訓(xùn):深入剖析與應(yīng)用
- 飛鼠養(yǎng)殖技術(shù)指導(dǎo)
- 壞死性筋膜炎
- 整式的加減單元測(cè)試題6套
- 股權(quán)架構(gòu)完整
- 山東省泰安市2022年初中學(xué)業(yè)水平考試生物試題
- 注塑部質(zhì)量控制標(biāo)準(zhǔn)全套
- 人教A版高中數(shù)學(xué)選擇性必修第一冊(cè)第二章直線和圓的方程-經(jīng)典例題及配套練習(xí)題含答案解析
- 銀行網(wǎng)點(diǎn)服務(wù)禮儀標(biāo)準(zhǔn)培訓(xùn)課件
- 二年級(jí)下冊(cè)數(shù)學(xué)教案 -《數(shù)一數(shù)(二)》 北師大版
- 晶體三極管資料
評(píng)論
0/150
提交評(píng)論