日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构_二叉树遍历

發(fā)布時(shí)間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构_二叉树遍历 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#include<stdlib.h> #include<stdio.h> #define MAX 50 #define MAS 20 #define CHAR 1typedef char elem; //定義二叉樹的數(shù)據(jù)結(jié)構(gòu) typedef struct node{elem data;//二叉樹的值struct node *lchild; //左孩子struct node *rchild;//右孩子struct node *parent;//父節(jié)點(diǎn) }BinTNode,*BinTree; //定義二叉樹的初始化函數(shù) BinTNode *Init_BinTree(BinTNode *tree){tree=NULL; //將NULL賦值給treereturn tree; //返回tree } //創(chuàng)建二叉樹 BinTNode *Create_BinTree(BinTNode *tree){elem ch;scanf("%c",&ch); //將鍵入值賦給二叉樹的節(jié)點(diǎn)if(ch==' ') // 以空格作為空左孩子和空右孩子的表示tree=NULL;else{ //申請(qǐng)空間,以及通過對(duì)左右孩子的遞歸完成二叉樹的創(chuàng)建tree=(BinTNode *)malloc(sizeof(BinTNode));if(!tree) exit(0);tree->data=ch; tree->parent=NULL;tree->lchild=Create_BinTree(tree->lchild);if(tree->lchild) tree->lchild->parent=tree;tree->rchild=Create_BinTree(tree->rchild);if(tree->rchild) tree->rchild->parent=tree;}return tree;//返回tree }//在屏幕上輸出創(chuàng)建的二叉樹,采用遞歸算法 void PrintTree(BinTNode *tree,int i){if(tree!=NULL){ //采用條件編譯對(duì)CHAR事先進(jìn)行編譯PrintTree(tree->rchild,i+5);#if CHARif(tree->data!=' ')printf("%*c\n",i,tree->data);#elseif(tree->data!=' ')printf("%*d\n",i,tree->data);#endifPrintTree(tree->lchild,i+5);i=i-5;} }/*先序遍歷(遞歸)*/ void Pre_Order(BinTNode *tree){if(tree!=NULL){printf("%c"" ",tree->data);Pre_Order(tree->lchild);Pre_Order(tree->rchild);} }/*中序遍歷(遞歸)*/ void In_Order(BinTNode *tree){if(tree!=NULL){In_Order(tree->lchild);printf("%c"" ",tree->data);In_Order(tree->rchild);} } //中序遍歷(非遞歸),利用棧結(jié)構(gòu)存儲(chǔ)數(shù)據(jù) void In_OrderX(BinTNode *tree,void(*visit)(elem)){BinTNode *p,*stack[MAS];int top;top=0; p=tree;while(top!=0||p!=NULL){while(p!=NULL){stack[top]=p; top++;p=p->lchild;}if(top!=0){p=stack[top-1];top--;visit(p->data);p=p->rchild;}} } /*后序遍歷(遞歸)*/ void Bac_Order(BinTNode *tree){if(tree!=NULL){Bac_Order(tree->lchild);Bac_Order(tree->rchild);printf("%c"" ",tree->data);} } /*后序遍歷(非遞歸),利用棧結(jié)構(gòu)存儲(chǔ)數(shù)據(jù) */ void Bac_OrderX(BinTNode *tree,void(*visit)(elem)){BinTNode *p,*stack[MAS];int top;top=0;stack[top]=tree; top++;while(top>0){p=stack[top-1]; top--;while(p!=NULL){visit(p->data);stack[top]=p->rchild;top++;p=p->lchild;}} }void visit(elem e){printf("%c"" ",e); }int main() { int i;BinTree tree;tree=Init_BinTree(tree);#if CHARprintf("請(qǐng)先序輸入二叉樹(如:abc d e ):");#elseprintf("請(qǐng)先序輸入二叉樹(如:a b 表示a為根結(jié)點(diǎn),b為左子樹的二叉樹)\n");#endiftree=Create_BinTree(tree);printf("輸入建立的二叉樹!!!\n");PrintTree(tree,5);do{printf("------------------------------------------------------------");printf("\n 主菜單:");printf("\n 1 先序遍歷(遞歸)");printf("\n 2 中序遍歷(遞歸)");printf("\n 3 中序遍歷(非遞歸)");printf("\n 4 后序遍歷(遞歸)");printf("\n 5 后序遍歷(非遞歸)");// printf("\n 6 ");printf("\n 0 退出");printf("\n----------------------------------------------------------");printf("\n");printf("親,請(qǐng)輸入功能數(shù)字:");scanf("%d",&i);switch(i){case 1: printf("先序遍歷(遞歸)結(jié)果為:");Pre_Order(tree); break;case 2: printf("中序遍歷(遞歸)結(jié)果為:");In_Order(tree); break;case 3: printf("中序遍歷(非遞歸)結(jié)果為:");In_OrderX(tree,visit) ; break;case 4: printf("后序遍歷(遞歸)結(jié)果為:");Bac_Order(tree); break;case 5: printf("后序遍歷(非遞歸)結(jié)果為:");Bac_Order(tree,visit); break;case 0: exit(0);default :printf("親,請(qǐng)輸入--菜單--中的功能數(shù)字!");}printf("\n \n");}while(i>0||i<8);return 0; }

?

課題二

一、?? 目的

二叉樹的遍歷算法實(shí)現(xiàn)

二、?? 實(shí)習(xí)環(huán)境

個(gè)人計(jì)算機(jī),Windows操作系統(tǒng),Visual C++6.0編譯開發(fā)環(huán)境

三、?? 實(shí)習(xí)內(nèi)容、步驟與要求

遍歷是對(duì)樹的一種最基本的運(yùn)算,所謂遍歷二叉樹,就是按一定的規(guī)則和順序走遍二叉樹的所有結(jié)點(diǎn),使每一個(gè)結(jié)點(diǎn)都被訪問一次,而且只被訪問一次。由于二叉樹是非線性結(jié)構(gòu),因此,樹的遍歷實(shí)質(zhì)上是將二叉樹的各個(gè)結(jié)點(diǎn)轉(zhuǎn)換成為一個(gè)線性序列來(lái)表示。

遞歸算法的算法實(shí)現(xiàn):

先序遍歷:

若二叉樹非空,則依次執(zhí)行如下操作:

(1) 訪問根結(jié)點(diǎn);(2) 遍歷左子樹;(3) 遍歷右子樹。

中序遍歷:

若二叉樹非空,則依次執(zhí)行如下操作:

(1)遍歷左子樹; (2)訪問根結(jié)點(diǎn);(3)遍歷右子樹。

后序遍歷:

若二叉樹非空,則依次執(zhí)行如下操作:

(1)遍歷左子樹;(2)遍歷右子樹;(3)訪問根結(jié)點(diǎn)。

非遞歸算法的實(shí)現(xiàn):

中序遍歷:

??對(duì)于任一結(jié)點(diǎn)P,

? 1)若其左孩子不為空,則將P入棧并將P的左孩子置為當(dāng)前的P,然后對(duì)當(dāng)前結(jié)點(diǎn)P再進(jìn)行相同的處理;

??2)若其左孩子為空,則取棧頂元素并進(jìn)行出棧操作,訪問該棧頂結(jié)點(diǎn),然后將當(dāng)前的P置為棧頂結(jié)點(diǎn)的右孩子;

? 3)直到P為NULL并且棧為空則遍歷結(jié)束

后序遍歷:

要保證根結(jié)點(diǎn)在左孩子和右孩子訪問之后才能訪問,因此對(duì)于任一結(jié)點(diǎn)P,先將其入棧。

1)???????? 如果P不存在左孩子和右孩子,則可以直接訪問它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被訪問過了,則同樣可以直接訪問該結(jié)點(diǎn)。

2)???????? 若非上述兩種情況,則將P的右孩子和左孩子依次入棧,這樣就保證了每次取棧頂元素的時(shí)候,左孩子在右孩子前面被訪問,左孩子和右孩子都在根結(jié)點(diǎn)前面被訪問。

?

四:源程序:

#include<stdlib.h>

#include<stdio.h>

#define MAX? 50

#define MAS? 20

#define CHAR 1

?

typedef char elem;

//定義二叉樹的數(shù)據(jù)結(jié)構(gòu)

typedef struct node{

??? elem data;//二叉樹的值

??? ?struct node *lchild;??? //左孩子

??? ?struct node *rchild;//右孩子

??? ?struct node *parent;//父節(jié)點(diǎn)

}BinTNode,*BinTree;

//定義二叉樹的初始化函數(shù)

BinTNode *Init_BinTree(BinTNode *tree){

??? ?tree=NULL; //將NULL賦值給tree

??? ?return tree; //返回tree

}

//創(chuàng)建二叉樹

BinTNode *Create_BinTree(BinTNode *tree){

??? elem ch;

??? scanf("%c",&ch);???????? //將鍵入值賦給二叉樹的節(jié)點(diǎn)

??? ?if(ch==' ')??????????????? // 以空格作為空左孩子和空右孩子的表示

?????? tree=NULL;

??? ?else{?????? ?//申請(qǐng)空間,以及通過對(duì)左右孩子的遞歸完成二叉樹的創(chuàng)建

?????? tree=(BinTNode *)malloc(sizeof(BinTNode));

??? ??? if(!tree)

?????????? exit(0);

??? ? tree->data=ch;

??? ? tree->parent=NULL;

??? ? tree->lchild=Create_BinTree(tree->lchild);

??? ? if(tree->lchild)

?????? ? tree->lchild->parent=tree;

??? ? tree->rchild=Create_BinTree(tree->rchild);

??? ? if(tree->rchild)

?????? ? tree->rchild->parent=tree;

??? ?}

??? ?return tree;//返回tree

}

? //在屏幕上輸出創(chuàng)建的二叉樹,采用遞歸算法

void PrintTree(BinTNode *tree,int i){

??? if(tree!=NULL){????????????????? //采用條件編譯對(duì)CHAR事先進(jìn)行編譯

?????? PrintTree(tree->rchild,i+5);

??? #if CHAR

?????? if(tree->data!=' ')

?????? printf("%*c\n",i,tree->data);

??? #else

?????? if(tree->data!=' ')

?????? printf("%*d\n",i,tree->data);

??? #endif

?????? PrintTree(tree->lchild,i+5);

?????? i=i-5;

??? }

}

?

/*先序遍歷(遞歸)*/

void? Pre_Order(BinTNode *tree){

??? if(tree!=NULL){

?????? printf("%c"" ",tree->data);

?????? Pre_Order(tree->lchild);

?????? Pre_Order(tree->rchild);

??? }

}

?

?

/*中序遍歷(遞歸)*/

void In_Order(BinTNode *tree){

??? if(tree!=NULL){

?????? In_Order(tree->lchild);

?????? printf("%c"" ",tree->data);

?????? In_Order(tree->rchild);

??? }

}

//中序遍歷(非遞歸),利用棧結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)

void In_OrderX(BinTNode *tree,void(*visit)(elem)){

??? BinTNode *p,*stack[MAS];

??? int top;

??? top=0;? p=tree;

??? while(top!=0||p!=NULL){

?????? while(p!=NULL){

?????????? stack[top]=p; top++;

?????????? p=p->lchild;

?????? ?}

?????? if(top!=0){

?????????? p=stack[top-1];

?????????? top--;

?????????? visit(p->data);

?????????? p=p->rchild;

?????? }

??? }

}

/*后序遍歷(遞歸)*/

void Bac_Order(BinTNode *tree){

??? if(tree!=NULL){

?????? Bac_Order(tree->lchild);

?????? Bac_Order(tree->rchild);

?????? printf("%c"" ",tree->data);

??? }

}

/*后序遍歷(非遞歸),利用棧結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)?? */

void Bac_OrderX(BinTNode *tree,void(*visit)(elem)){

??? BinTNode *p,*stack[MAS];

??? int top;

??? top=0;

??? stack[top]=tree; top++;

??? while(top>0){

?????? p=stack[top-1];

?????? top--;

?????? while(p!=NULL){

?????????? visit(p->data);

?????????? stack[top]=p->rchild;

?????????? top++;

?????????? p=p->lchild;

?????? }

??? }

}

?

void visit(elem e){

??? printf("%c"" ",e);

}

?

?

int main()

{

??? int i;

??? BinTree tree;

??? tree=Init_BinTree(tree);

??? #if CHAR

?????? printf("請(qǐng)先序輸入二叉樹(如:abc? d? e? ):");

??? #else

?????? printf("請(qǐng)先序輸入二叉樹(如:a b??? 表示a為根結(jié)點(diǎn),b為左子樹的二叉樹)\n");

??? #endif

??? tree=Create_BinTree(tree);

??? printf("輸入建立的二叉樹!!!\n");

??? PrintTree(tree,5);

??? do{

?????? printf("------------------------------------------------------------");

?????? printf("\n 主菜單:");

?????? printf("\n? 1? 先序遍歷(遞歸)");

?????? printf("\n? 2? 中序遍歷(遞歸)");

?????? printf("\n? 3? 中序遍歷(非遞歸)");

?????? printf("\n? 4? 后序遍歷(遞歸)");

?????? printf("\n? 5? 后序遍歷(非遞歸)");

??? //? printf("\n? 6????????????????? ");

?????? printf("\n? 0??? 退出");

?????? printf("\n----------------------------------------------------------");

?????? printf("\n");

?????? printf("親,請(qǐng)輸入功能數(shù)字:");

?????? scanf("%d",&i);

?????? switch(i){

?????????? case 1: printf("先序遍歷(遞歸)結(jié)果為:");

????????????????? Pre_Order(tree); break;

?????????? case 2: printf("中序遍歷(遞歸)結(jié)果為:");

????????????????? In_Order(tree); break;

??? ??????? case 3: printf("中序遍歷(非遞歸)結(jié)果為:");

????????????????? In_OrderX(tree,visit) ;? break;

?????????? case 4:??? printf("后序遍歷(遞歸)結(jié)果為:");

????????????????? Bac_Order(tree); break;

?????????? case 5: printf("后序遍歷(非遞歸)結(jié)果為:");

????????????????? Bac_Order(tree,visit); break;

?????????? case 0: exit(0);

?????????? default :printf("親,請(qǐng)輸入--菜單--中的功能數(shù)字!");

?????? }

??? printf("\n \n");

??? }

??? while(i>0||i<8);

??? return 0;

}

?

轉(zhuǎn)載于:https://www.cnblogs.com/askDing/p/KE.html

總結(jié)

以上是生活随笔為你收集整理的数据结构_二叉树遍历的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。