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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二叉树的操作2

發布時間:2023/12/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树的操作2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【實現二叉樹的 3 種遍歷算法】

問題描述:該算法的設計,要求運行結果如下所示:

二叉樹 bt:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))

***層次遍歷序列:A B C D E F G H I J K L M N

先序遍歷序列:

遞歸算法:A B D E H J K L M N C F G I

非遞歸算法:A B D E H J K L M N C F G I

中序遍歷序列:

遞歸算法:D B J H L K M N E A F C G I

非遞歸算法:D B J H L K M N E A F C G I

后序遍歷序列:

遞歸算法:D J L N M K H E B F I G C A

***非遞歸算法:D J L N M K H E B F I G C A
二叉樹的遍歷,是二叉樹最基本的也是最重要的。有三種遍歷方式,先序,中序和后序。
同樣,各種遍歷方式分為遞歸和非遞歸的兩種。而層次遍歷則是一遍bfs就可以了。最基礎的bfs。非遞歸遍歷的時候,我們需要結合棧的數據結構,先進后出。主要看代碼:

#include<bits/stdc++.h> #define telemtype char using namespace std;typedef struct node{telemtype data;struct node *lchild,*rchild;int vis; } *Bitree; void creatree(Bitree &tt) {char c;cin>>c;if(c=='#') tt=NULL;else{tt=(node *)malloc(sizeof(node));tt->data=c;tt->vis=0;creatree(tt->lchild);creatree(tt->rchild);} }void bfs(Bitree &t)//層次遍歷 {queue<Bitree>p;p.push(t);while(!p.empty()){Bitree q;q=p.front();p.pop();printf("%c ",q->data);if(q->lchild) p.push(q->lchild);if(q->rchild) p.push(q->rchild);} }void xprinttree(Bitree &t)//先序遍歷遞歸算法 {if(t){printf("%c ",t->data);xprinttree(t->lchild);xprinttree(t->rchild);} }void zprinttree(Bitree &t)//中序遍歷遞歸算法 {if(t){zprinttree(t->lchild);printf("%c ",t->data);zprinttree(t->rchild);} }void hprinttree(Bitree &t)//后序遍歷遞歸算法 {if(t){hprinttree(t->lchild);hprinttree(t->rchild);printf("%c ",t->data);} }void InOrderTraversal_NoRecursion(node *T)//中序遍歷非遞歸算法 {node *Stack[1010];int top = -1;while(T || (top != -1)) {while(T) {Stack[++top] = T;T = T->lchild;} if(top != -1) {T = Stack[top--];printf("%c ", T->data);T = T->rchild;}} }void outOrderTraversal_NoRecursion(node *T)//先序遍歷非遞歸算法 {node *Stack[1010];int top=-1;while(T||(top!=-1)){while(T){cout<<T->data<<" ";Stack[++top]=T;T=T->lchild;}if(top!=-1){T=Stack[top--];T=T->rchild;}} }void laterOrderTraversal_NoRecursion(node *T)//后序遍歷非遞歸算法 {node *Stack[1010];int top=-1;while(T||(top!=-1)){while(T){Stack[++top]=T;T=T->lchild;}if(top!=-1){T=Stack[top--];if(T->vis==0){T->vis=1;Stack[++top]=T;T=T->rchild;}else{cout<<T->data<<" ";T=NULL; //如果加這一句,會無限循環跳不出去。}}} }int main() {Bitree t;creatree(t);cout<<"二叉樹創建完成。"<<endl;cout<<"先序遍歷二叉樹(遞歸算法):"<<endl;xprinttree(t);cout<<"\n中序遍歷二叉樹(遞歸算法):"<<endl;zprinttree(t);cout<<"\n后序遍歷二叉樹(遞歸算法):"<<endl;hprinttree(t);cout<<"\n層次遍歷二叉樹(廣搜bfs):"<<endl;bfs(t);cout<<"\n先序遍歷二叉樹(非遞歸算法): "<<endl;outOrderTraversal_NoRecursion(t);cout<<"\n中序遍歷二叉樹(非遞歸算法): "<<endl;InOrderTraversal_NoRecursion(t);cout<<"\n后序遍歷二叉樹(非遞歸算法): "<<endl;laterOrderTraversal_NoRecursion(t); }

努力加油a啊,(o)/~

總結

以上是生活随笔為你收集整理的二叉树的操作2的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。