[數(shù)據(jù)結(jié)構(gòu)4.3]二叉樹(shù)的遍歷

二叉樹(shù)的遍歷

按某條上搜索路徑訪問(wèn)樹(shù)中的每個(gè)結(jié)點(diǎn)笨蚁,樹(shù)的每個(gè)結(jié)點(diǎn)均被訪問(wèn)一次,而且只訪問(wèn)一次趟庄。


遍歷的三種方式:

1括细、先序便利(根左右);

2戚啥、中序便利(左根右)奋单;

3、中序便后(左右根)猫十;




先序遍歷

1览濒、訪問(wèn)根結(jié)點(diǎn)

2、先序便利左子樹(shù)

3拖云、先序便利右子樹(shù)


先序遍歷的遞歸算法:

void PerOrder(BiTree T){

? ? ? ? if(T!==null){

? ? ? ? ? ? ? ? visit(T);

? ??????????????PerOrder(T->lchild);

? ??????????????PerOrder(T->rchild);

????????}

}




中序遍歷

1贷笛、中序便利左子樹(shù)

2、訪問(wèn)根結(jié)點(diǎn)

3宙项、中序便利右子樹(shù)


中序遍歷的遞歸算法:

void InOrder(BiTree T){

????????if(T!==null){??

????????????????InOrder(T->lchild);

????????????????visit(T);

????????????????InOrder(T->rchild);

????????}

}




后序遍歷?

1乏苦、后序便利左子樹(shù)

3、后序便利右子樹(shù)

2尤筐、訪問(wèn)根結(jié)點(diǎn)


后序遍歷的遞歸算法:

void PostOrder(BiTree T){

if(T!==null){

???????????????? PostOrder (T->lchild);

? ???????????????PostOrder (T->rchild);

????????????????visit(T);

????????}

}




中序遍歷非遞歸算法汇荐,借助棧,算法思想:

1盆繁、初始時(shí)依次掃描根結(jié)點(diǎn)的所有左側(cè)結(jié)點(diǎn)掀淘,并將它們一一進(jìn)棧;

2改基、出棧一個(gè)結(jié)點(diǎn)繁疤,訪問(wèn)它;

3秕狰、掃描該結(jié)點(diǎn)的右孩子結(jié)點(diǎn)并將其進(jìn)棧稠腊;

4、依次掃描右孩子結(jié)點(diǎn)的所有左側(cè)結(jié)點(diǎn)并一一進(jìn)棧鸣哀;

5架忌、反復(fù)該過(guò)程直到棧空為止我衬。

void InOrder2(BiTree T){

? ? ? ? InitStack(S);BiTree p = T;

? ? ? ? while(p||!IsEmpty(S)){

? ? ? ? ? ? ? ? if(p){

? ? ? ? ? ? ? ? ? ????? Push(S,p);

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

? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? ? ????Pop(S,p);

? ? ? ? ? ? ? ? ? ? ????visit(p);

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

? ? ? ? ? ? ????}

? ? ? ? }

}




層次遍歷

1叹放、初始將根入隊(duì)并訪問(wèn)根結(jié)點(diǎn)饰恕,然后出隊(duì);

2井仰、若有左子樹(shù)埋嵌,則將左子樹(shù)的根入隊(duì);

3俱恶、若有右子樹(shù)雹嗦,則將右子樹(shù)的根入隊(duì);

4合是、然后出隊(duì)了罪,訪問(wèn)該結(jié)點(diǎn);

5聪全、反復(fù)該過(guò)程直到隊(duì)列空為止泊藕;

void levelOrder(BiTree T){

? ? ? ? InitQueue(Q);

? ? ? ? BiTree p;

? ? ? ? EnQueue(Q,T);

? ? ? ? while(!isEmpty(Q)){

? ? ? ? ? ? ? ? DeQueue(Q,p);

? ? ? ? ? ? ? ? visit(p);

? ? ? ? ? ? ? ? if(p->lchild!=null){

? ? ? ? ? ? ? ? ? ? ? ? EnQueue(Q,p->lchild);

? ? ? ? ? ? ? ? }

? ??????????????if(p-rchild!=null){

? ? ? ? ? ? ? ? ? ? ? ? EnQueue(Q,p->rchild);

? ? ? ? ? ? ? ? }

? ? ? ? }

}




由遍歷序列構(gòu)造二叉樹(shù)

(后)先序遍歷序列和中序遍歷序列可以確定一顆二叉樹(shù),而后序遍歷序列和先序遍歷序列不可以確定一顆二叉樹(shù)难礼。


中序遍歷序列和先序遍歷序列

1娃圆、在先序序列中,第一個(gè)結(jié)點(diǎn)是根結(jié)點(diǎn)鹤竭;

2踊餐、根結(jié)點(diǎn)將中序遍歷序列劃分為兩部分;

3臀稚、然后在先序序列中確定兩部分的結(jié)點(diǎn)吝岭,并且兩部分的第一個(gè)結(jié)點(diǎn)分別為左子樹(shù)和右子樹(shù)的根;

4吧寺、在子樹(shù)中遞歸重復(fù)該過(guò)程窜管,便能唯一確定一課二叉樹(shù)。




線索二叉樹(shù)


線索化:

若無(wú)左子樹(shù)稚机,則將左指針指向其前驅(qū)結(jié)點(diǎn)幕帆;

若無(wú)右子樹(shù),則將右指針指向其后驅(qū)結(jié)點(diǎn)赖条;


線索二叉樹(shù)結(jié)點(diǎn)結(jié)構(gòu)

typedef struct ThreadNode{

? ? ? ? ElemType data;

? ? ? ? struct ThreadNode *lchild,*rchild;

? ? ? ? int ltag,rtag;

}ThreadNode,*ThreadTree;


這種結(jié)點(diǎn)結(jié)構(gòu)構(gòu)成的二叉鏈表作為二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)失乾,稱為線索鏈表。


線索二叉樹(shù)




中序線索二叉樹(shù)


中序線索二叉樹(shù)


前驅(qū)結(jié)點(diǎn):

如果左指針為線索纬乍,則其指向結(jié)點(diǎn)為前驅(qū)結(jié)點(diǎn)

如果左指針為左孩子碱茁,則其左子樹(shù)的最右側(cè)結(jié)點(diǎn)為前驅(qū)結(jié)點(diǎn)


后驅(qū)結(jié)點(diǎn):

如果右指針為線索,則其指向結(jié)點(diǎn)為后驅(qū)結(jié)點(diǎn)

如果右指針為左孩子仿贬,則其右子樹(shù)的最左側(cè)結(jié)點(diǎn)為后驅(qū)結(jié)點(diǎn)


中序線索二叉樹(shù)線索化


線索化


初始化


引入了頭結(jié)點(diǎn)的線索二叉樹(shù)


線索二叉樹(shù)


中序線索二叉樹(shù)的遍歷


遍歷 中序線索二叉樹(shù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纽竣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜓氨,老刑警劉巖聋袋,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異穴吹,居然都是意外死亡幽勒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)港令,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)代嗤,“玉大人,你說(shuō)我怎么就攤上這事缠借。” “怎么了宜猜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵泼返,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我姨拥,道長(zhǎng)绅喉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任叫乌,我火速辦了婚禮柴罐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘憨奸。我一直安慰自己革屠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布排宰。 她就那樣靜靜地躺著似芝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪板甘。 梳的紋絲不亂的頭發(fā)上党瓮,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音盐类,去河邊找鬼寞奸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛在跳,可吹牛的內(nèi)容都是我干的枪萄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼硬毕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呻引!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吐咳,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逻悠,失蹤者是張志新(化名)和其女友劉穎元践,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體童谒,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡单旁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饥伊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片象浑。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖琅豆,靈堂內(nèi)的尸體忽然破棺而出愉豺,到底是詐尸還是另有隱情,我是刑警寧澤茫因,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布蚪拦,位于F島的核電站,受9級(jí)特大地震影響冻押,放射性物質(zhì)發(fā)生泄漏驰贷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一洛巢、第九天 我趴在偏房一處隱蔽的房頂上張望括袒。 院中可真熱鬧,春花似錦稿茉、人聲如沸锹锰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)城须。三九已至,卻和暖如春米苹,著一層夾襖步出監(jiān)牢的瞬間糕伐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蘸嘶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留良瞧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓训唱,卻偏偏與公主長(zhǎng)得像褥蚯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子况增,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容