黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 淺談二叉樹中序遍歷

淺談二叉樹中序遍歷

更新時間:2021-02-03 17:34:11 來源:動力節(jié)點(diǎn) 瀏覽1878次

由于二叉樹是非線性結(jié)構(gòu),因此,樹的遍歷實(shí)質(zhì)上是將二叉樹的各個結(jié)點(diǎn)轉(zhuǎn)換成為一個線性序列來表示。先序、中序、后序遍歷二叉樹的區(qū)別在于:根節(jié)點(diǎn)被訪問的先后。也就是每種遍歷方式的按自己獨(dú)特的規(guī)則和順序走遍二叉樹的所有結(jié)點(diǎn),使每一個結(jié)點(diǎn)都被訪問一次,而且只被訪問一次。本文我們主要來探討一下二叉樹中序遍歷

先訪問根節(jié)點(diǎn)再訪問其左右子樹,這是先序遍歷;按照左子樹、根節(jié)點(diǎn)、右子樹的順序訪問的方式便為中序遍歷;那么后序遍歷,自然就是先訪問左右子樹,再訪問根節(jié)點(diǎn)了。二叉樹的三種遍歷方式其實(shí)思想都是一樣的,掌握了一種就可以舉一反三。

中序遍歷遞歸寫法很簡單,就是直接按照定義來實(shí)現(xiàn)就 OK 了。

status Mid_view_root(BTpoint T,status (*view)(TElemType e)) ???//中序遍歷的遞歸寫法
{
??if(T!=NULL)
??{
????if(Mid_view_root(T->lchild,view))
??????if(Print_tree_data(T->data)) ???
????????if(Mid_view_root(T->rchild,view))
??????????return OK;
????return ERROR;
??}
??else return OK;
}

那么中序遍歷的非遞歸形式該怎么寫呢?

首先,中序遍歷(非遞歸)得用到「 棧 」這種數(shù)據(jù)結(jié)構(gòu)。棧的特點(diǎn)是:先進(jìn)后出,我們也正是利用了這個特點(diǎn)來實(shí)現(xiàn)中序遍歷的非遞歸形式。

那么,這又是如何實(shí)現(xiàn)的呢?

先遍歷二叉樹的根節(jié)點(diǎn)的左子樹到最后一個左子樹節(jié)點(diǎn),按順序?qū)⑺鼈內(nèi)霔#怀鰲2⑤敵鲎詈笠粋€左子樹節(jié)點(diǎn);讀取該節(jié)點(diǎn)的右子樹,重復(fù)上述操作。如果一個結(jié)點(diǎn)的左右子樹都被訪問過,則退回到該節(jié)點(diǎn)的父結(jié)點(diǎn),將其輸出,讀取右子樹。如此循環(huán),最后就能得到中序遍歷(非遞歸)的輸出了。

假設(shè)有這么一棵二叉樹:

首先,結(jié)點(diǎn)「 1 」進(jìn)棧,因?yàn)樗凶笞訕洌x取左子樹到最后一個左子樹結(jié)點(diǎn)「 4 」,在這過程中將它們按序進(jìn)棧,這時棧中的元素為「1, 2, 4 」。「 4 」出棧,讀取它的右子樹,重復(fù)上述操作,得到棧中元素為「 1, 2, 7 」。「 7 」出棧,因?yàn)榻Y(jié)點(diǎn)「 7 」沒有右子樹,可視為已訪問過其右子樹,退回到結(jié)點(diǎn)「 7 」的父結(jié)點(diǎn)即結(jié)點(diǎn)「 4 」。因?yàn)椤?4 」的左右子樹都已被訪問過,退回到其父結(jié)點(diǎn)「 2 」,「 2 」出棧,讀取其右子樹。

代碼實(shí)現(xiàn)有兩種方式。一種是比較復(fù)雜的,調(diào)用了棧的幾個函數(shù)來實(shí)現(xiàn)該功能。

//中序遍歷二叉排序樹(非遞歸)
Status InOrderTraverse2(BiTree T)
{
????SqStack S;
????BiTree p;
????p=(BiTree)malloc(sizeof(BiTNode));
????InitStack(S); ?// 構(gòu)建一個空棧
???p=T;
????while(p||!StackEmpty(S)) ??// StackEmpty( S ) ?判斷棧是否為空
???{
????????if(p)
????????{
????????????Push(S,p); ???????// 入棧
???????????p=p->lchild;
????????}
????????else
????????{
????????????Pop(S,p); ??????// 出棧
???????????if(!PrintElement(p->data)) ????// 輸出結(jié)點(diǎn)的值
???????????????return ERROR;
????????????p=p->rchild;
????????}
????}
????printf("\n");
????return OK;
}

第二種就很簡潔了,不需要那么多個函數(shù),幾乎與我們的思路一模一樣:

//中序遍歷序列(非遞歸算法)
status M_nonrecursive(BTpoint T,Stack S) ???????
{
??while(T!=NULL||S.base!=S.top)
??{
????while(T!=NULL)
????{
??????*S.top++=T;
??????T=T->lchild;
????}
????T=*--S.top;
????Print_tree_data(T->data); ??// 輸出結(jié)點(diǎn)的值
???T=T->rchild;
??}
??return OK;
}

至于二叉樹前序和后序遍歷,基本上很容易就能推導(dǎo)出來了,因?yàn)槎弑闅v方式和二叉樹中序遍歷有許多的共通之處,在本站的數(shù)據(jù)結(jié)構(gòu)和算法教程中,對二叉樹遍歷所有方式有一個完整的描述和整理,感興趣的小伙伴可以前去觀看,收集這些優(yōu)秀的資料,化為己用,我們也能夠?qū)崿F(xiàn)知識積累的跨越。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 一级一级一片免费 | 青青草狠狠操 | 国产bbw| 成年做羞羞免费观看视频网站 | 日韩伦理片在线 | 日本免费成人网 | 国产在线麻豆精品观看 | 色噜噜狠狠狠色综合久 | 国产人成精品综合欧美成人 | 91视频一区二区 | 日韩中文字幕不卡 | 国产人伦视频在线观看 | jizz国产丝袜18老师美女 | yy6080午夜论理网 | 男人使劲桶女人下面动态图片 | 五月天婷婷在线播放 | 22eee在线播放成人免费视频 | 欧美在线观看一区二区三区 | 亚洲成人一区二区 | 日韩欧美精品综合一区二区三区 | 成人激情小视频 | 日本午夜精品 | 青草网在线观看 | 亚洲欧美精品一中文字幕 | 天天av天天翘天天综合网 | 性色a v 一区 | 在线日韩国产 | 国产日产亚洲欧美综合另类 | 国产人成亚洲第一网站在线播放 | 男女视频在线观看网站 | 狠狠干2021| 香蕉狠狠干 | 中文字幕第315页 | 最近的最新的中文字幕视频 | 一级女性全黄久久生活片免费 | 中文精品久久久久中文 | 欧美在线观看一区二区三区 | 波多野结衣视频免费观看 | 男人下面进女人下面视频免费 | 欧美久久久久久久久 | 国产黄色大片在线观看 |