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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【笔记】二叉树递归算法和非递归算法的实现 先序/中序/后续遍历 打印结点以及顺序数 构造二叉树

發(fā)布時間:2024/9/30 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【笔记】二叉树递归算法和非递归算法的实现 先序/中序/后续遍历 打印结点以及顺序数 构造二叉树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

遞歸先序遍歷和中序遍歷

先序:

void preorder(bnode *t){if(t!=NULL){ visit(t);preorder(t->lchild); preorder(t->rchlid);} }

中序:

void inorder(bnode *t){if(t!=NULL){inorder(t->lchild);visit(t);inorder(t->rchlid);}}

后序:

void postorder (bnode *t){if(t!=NULL){postorder (t->lchild);postorder (t->rchlid); visit(t); }}

打印二叉樹的結(jié)點以及先序遍歷的順序數(shù)

void printnode( bnode *T, int &k ) { //設(shè)調(diào)用時k對應(yīng)的實參初始化為0if ( T != NULL ) {k++;cout<<(’T->data<<,<<k<<),;printnode( T -> lchild, k );printnode( T -> rchild, k );}

遞歸算法求結(jié)點數(shù) 2、設(shè)計算法求二叉樹的結(jié)點數(shù):

分析:
(1)設(shè)置一個全局變量,在遍歷二叉樹的過程中,對訪問的結(jié)點累計計數(shù)。
(2) 設(shè)函數(shù)void num( bnode *T )表示對以T為根的二叉樹遍歷和計數(shù),分析如下:
如果T == NULL ——結(jié)點數(shù)為0,不必累計;
否則 結(jié)點數(shù) = 左子樹結(jié)點數(shù) + 右子樹結(jié)點數(shù)+1。

void num( bnode *T ) { //設(shè)k是全局變量,初始化k=0if ( T != NULL ) {k++;num( T -> lchild );num( T -> rchild );}}

可以設(shè)計為int型函數(shù)形式:

int num( bnode * T ) {if ( T == NULL ) return(0);else return num( T -> lchild ) + num( T -> rchild ) + 1;}

遞歸構(gòu)造二叉樹

void create ( bitre *&T ){cin >> x;if ( x ==.) T = NULL;else{T = new bnode;T -> data = x;create ( T -> lchild );create ( T -> rchild );} }

非遞歸的先序/中序/后續(xù)算法

先序:
用一個一維數(shù)組stack[maxnode]用以實現(xiàn)棧,變量top表示棧頂?shù)奈恢?/p> int bitTree::PreOrder(bitTree bt){ //預(yù)先定義bitTree這一個結(jié)點類作為新數(shù)據(jù)類型 bitTree stack[maxnode],p; int top; if(bt==nullptr)return 1;//空樹時 else{ p=bt;//p首先為根節(jié)點 top=-1;//棧頂 while(!(p==NULL&&top==-1)) { if(p!= NULL){ visit(p->data);//訪問p top++;//棧頂加一 stack[top]=p;//先訪問結(jié)點,然后入棧,然后指向右孩子 p=p->lchild; } else{ p=stack[top]; top--; p=p->rchild;//指向右孩子 }}

注意:中序遍歷則把visit(p->data);移到p=stack[top]和
p=p->rchild;之間。
后序遍歷的非遞歸:與先序 中序不同,后序遍歷過程中,結(jié)點第一次出棧后,還要再次入棧,即結(jié)點要入兩次棧,出兩次棧,而訪問結(jié)點是在第二次出棧時訪問。因此為了區(qū)別同一個結(jié)點指針的兩次出棧,設(shè)置一個標(biāo)志flag:flag為1表示第一次出棧,為2表示第二次出棧,此時可以訪問??梢詫V性財?shù)據(jù)類型定義為有指針域和標(biāo)志flag域的結(jié)構(gòu)體,如:
struct stacttype{
btTree link;
int flag;}

int bitTree::PostOrder(bitTree bt){ //預(yù)先定義bitTree這一個結(jié)點類作為新數(shù)據(jù)類型 bitTree stack[maxnode],p; int top,sign; if(bt==nullptr)return 1;//空樹時p=bt;//p首先為根節(jié)點 top=-1;//棧頂 while(!(p==NULL&&top==-1)) { if(p!=null){//結(jié)點第一次進(jìn)棧 top++; stack[top].link=p; stack[top].flag=1; p=p->lchild;//找結(jié)點的左孩子 else { p=stack[top].link; sign=stack[top].flag; top--;if(sign==1)//結(jié)點第二次進(jìn)棧 { top++; stack[top].link=p; stack[top].flag=2; p=p->rchild; } else{ visit(p->data); p=null;//注意這一步,p指向空} } return 1;//遍歷結(jié)束 }

總結(jié)

以上是生活随笔為你收集整理的【笔记】二叉树递归算法和非递归算法的实现 先序/中序/后续遍历 打印结点以及顺序数 构造二叉树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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