C語(yǔ)言編程學(xué)習(xí)之二叉樹(shù)的遍歷圖解

C語(yǔ)言是面向過(guò)程的,而C++是面向?qū)ο蟮?/p>

C和C++的區(qū)別:

C是一個(gè)結(jié)構(gòu)化語(yǔ)言,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計(jì)首要考慮的是如何通過(guò)一個(gè)過(guò)程,對(duì)輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過(guò)程(事務(wù))控制)。

C++,首要考慮的是如何構(gòu)造一個(gè)對(duì)象模型,讓這個(gè)模型能夠契合與之對(duì)應(yīng)的問(wèn)題域,這樣就可以通過(guò)獲取對(duì)象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過(guò)程(事務(wù))控制。 所以C與C++的最大區(qū)別在于它們的用于解決問(wèn)題的思想方法不一樣。之所以說(shuō)C++比C更先進(jìn),是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”。

C與C++的最大區(qū)別:在于它們的用于解決問(wèn)題的思想方法不一樣。之所以說(shuō)C++比C更先進(jìn),是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”,而就語(yǔ)言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,錯(cuò)!算法是程序設(shè)計(jì)的基礎(chǔ),好的設(shè)計(jì)如果沒(méi)有好的算法,一樣不行。而且,“C加上好的設(shè)計(jì)”也能寫(xiě)出非常好的東西。


小編推薦一個(gè)學(xué)C語(yǔ)言/C++的學(xué)習(xí)裙【 六九九,四七零,五九六 】,無(wú)論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開(kāi)發(fā)工具,很多干貨和技術(shù)資料分享!

1、先序遍歷(先訪問(wèn)根節(jié)點(diǎn))

先訪問(wèn)根節(jié)點(diǎn)

再先序遍歷左子樹(shù)

再先序遍歷右子樹(shù)

例:下圖:先訪問(wèn)根節(jié)點(diǎn)A,再先序訪問(wèn)A的左子樹(shù)B。A的左子樹(shù)B是一個(gè)樹(shù) ,所以先訪問(wèn)樹(shù)B的根節(jié)點(diǎn)B,再訪問(wèn)B的左子樹(shù)D。B的左子樹(shù)D是一個(gè)樹(shù),所以先訪問(wèn)D的根節(jié)點(diǎn)D,再訪問(wèn)D的左子樹(shù),D沒(méi)有左子樹(shù),再訪問(wèn)D的右子樹(shù),D沒(méi)有右子樹(shù),那么D訪問(wèn)完畢。再訪問(wèn)D的父親B的右子樹(shù)。B沒(méi)有右子樹(shù),那么B訪問(wèn)完畢。這樣A的左子樹(shù)訪問(wèn)完畢,序號(hào)為ABD。再訪問(wèn)A的右子樹(shù)C。先訪問(wèn)C的根節(jié)點(diǎn)C,再訪問(wèn)C的左子樹(shù)E,由于E沒(méi)有左子樹(shù)和右子樹(shù),所以E訪問(wèn)完畢。再訪問(wèn)C的右子樹(shù)F。F也是樹(shù),所以先訪問(wèn)F的根節(jié)點(diǎn)F,再訪問(wèn)F的左子樹(shù)G。G也是一個(gè)數(shù),所以先訪問(wèn)G的根節(jié)點(diǎn)G,而G沒(méi)有左右子樹(shù),G訪問(wèn)完畢。再訪問(wèn)G的父親F的右子樹(shù)。F沒(méi)有右子樹(shù),所以F訪問(wèn)完畢。因?yàn)镕是C的右子樹(shù),所以F訪問(wèn)完畢則C訪問(wèn)完畢。C訪問(wèn)完畢則整個(gè)樹(shù)訪問(wèn)完畢!

先序b遍歷

2、中序遍歷(中間訪問(wèn)根節(jié)點(diǎn))

中序遍歷左子樹(shù)

再訪問(wèn)根節(jié)點(diǎn)

再中序遍歷右節(jié)點(diǎn)

例:如下圖:

第一步中序遍歷A的左子樹(shù)B,由于左子樹(shù)B也是樹(shù),所以要先訪問(wèn)B的左子樹(shù)D。由于左子樹(shù)D也是樹(shù),所以要先訪問(wèn)D的左子樹(shù),D的左子樹(shù)為空,所以第1個(gè)訪問(wèn)的是左子樹(shù)的根節(jié)點(diǎn)D,再訪問(wèn)D的右子樹(shù),D的右子樹(shù)為空。所以D訪問(wèn)完畢。D訪問(wèn)完畢則B的左子樹(shù)訪問(wèn)完畢。第2個(gè)訪問(wèn)樹(shù)B的根節(jié)點(diǎn)B。再訪問(wèn)B的右子樹(shù)。因?yàn)锽的右子樹(shù)為空,所以B訪問(wèn)完畢。B訪問(wèn)完畢則A的左子樹(shù)訪問(wèn)完畢,所以第3個(gè)訪問(wèn)的是A。再訪問(wèn)A的右子樹(shù)C。因?yàn)镃也是樹(shù),所以先訪問(wèn)C的左子樹(shù)E。因?yàn)镋也是樹(shù),所以先訪問(wèn)E的左子樹(shù),E的左子樹(shù)為空,所以第4個(gè)訪問(wèn)的是E。再訪問(wèn)E的右子樹(shù),E的右子樹(shù)為空,所以C的左子樹(shù)訪問(wèn)完畢,接著訪問(wèn)C,所以第5個(gè)訪問(wèn)的是節(jié)點(diǎn)C。接著訪問(wèn)C的右子樹(shù)F。因?yàn)镕是樹(shù),所以先訪問(wèn)F的左子樹(shù)G。因?yàn)镚也是樹(shù),所以先訪問(wèn)G的左子樹(shù)。G的左子樹(shù)為空,所以第6個(gè)訪問(wèn)的是節(jié)點(diǎn)G。再訪問(wèn)G的右子樹(shù)。G的右子樹(shù)為空,所以節(jié)點(diǎn)G訪問(wèn)完畢。G訪問(wèn)完畢則F的左子樹(shù)訪問(wèn)完畢,所以第7個(gè)訪問(wèn)的是節(jié)點(diǎn)F。F的右子樹(shù)為空,所以F訪問(wèn)完畢,則C的右子樹(shù)訪問(wèn)完畢,所以A的右子樹(shù)訪問(wèn)完畢,整個(gè)樹(shù)訪問(wèn)完畢!

小編推薦一個(gè)學(xué)C語(yǔ)言/C++的學(xué)習(xí)裙【 六九九,四七零,五九六 】,無(wú)論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開(kāi)發(fā)工具,很多干貨和技術(shù)資料分享!

中序遍歷

3、后序遍歷(最后訪問(wèn)根節(jié)點(diǎn))

后序遍歷左子樹(shù)

后續(xù)遍歷右子樹(shù)

再訪問(wèn)根節(jié)點(diǎn)

后續(xù)遍歷

已知兩種遍歷序列求二叉樹(shù):只有已知一個(gè)樹(shù)的先序和中序或者是后序和中序,才可以還原出二叉樹(shù)的樣子。知道先序和后序是不可以還原出二叉樹(shù)。

例1、已知先序和中序還原出二叉樹(shù):

例1:已知先序:ABCDEFGH

中序:BDCEAFHG

求后序

解:先序中第一個(gè)出現(xiàn)的一定是根節(jié)點(diǎn),所以在先序中第一個(gè)出現(xiàn)的A是根節(jié)點(diǎn)。中序中找出該根節(jié)點(diǎn)左邊為左子樹(shù),右邊為右子樹(shù)。由于中序是先訪問(wèn)左子樹(shù)再訪問(wèn)根節(jié)點(diǎn)再訪問(wèn)右子樹(shù)。所以在中序中A的左邊是A的左子樹(shù),所以BDCE是A的左子樹(shù);

從先序中找到BDCE的順序是BCDE所以B是A左子樹(shù)的根節(jié)點(diǎn);

在中序中B的左邊一定是B的左子樹(shù)。由于B左邊沒(méi)有,所以B沒(méi)有左子樹(shù),DCE是B的右子樹(shù);

在先序中DCE三個(gè)個(gè)節(jié)點(diǎn)C是第一個(gè)出現(xiàn)的,所以C是B右子樹(shù)的根節(jié)點(diǎn);

再?gòu)闹行蛑蠨和E分別在C的左右,所以D是C的左子樹(shù),E是C的右子樹(shù),這樣A的左子樹(shù)確定那個(gè)。

再同樣確定A的右子樹(shù) 在中序中A的右邊FHG在先序中F第一個(gè)出現(xiàn),所以F是A的右子樹(shù)的根節(jié)點(diǎn);

再?gòu)闹行蛑蠪左邊沒(méi)有,所以F沒(méi)有左子樹(shù);HG是F的右子樹(shù);

再?gòu)南刃蛑写_定HG第一個(gè)出現(xiàn)的是G,所以G是F的右子樹(shù)的根;

再?gòu)闹行蛑蠫左邊是H,右邊沒(méi)有,所以H是G的左子是,G沒(méi)有右子樹(shù)。

這樣還原出樹(shù)和后序如下圖:

小編推薦一個(gè)學(xué)C語(yǔ)言/C++的學(xué)習(xí)裙【 六九九,四七零,五九六 】,無(wú)論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開(kāi)發(fā)工具,很多干貨和技術(shù)資料分享!

例2、已知后序和中序求先序:

已知中序:BDCEAFHG

后序:DECBHGFA

求先序。

解:后序中最后一個(gè)一定是根節(jié)點(diǎn),再在中序中找出做右子樹(shù)。

從后序中求出根節(jié)點(diǎn):A;

從中序中求出A的左子樹(shù):BDCE,右子樹(shù):FHG;

后序中求出A的左子樹(shù)BDCE的根結(jié)點(diǎn):B;

中序中求出B的左子樹(shù):空,右子樹(shù):DCE;

后序中求出樹(shù)DCE的根節(jié)點(diǎn):C;

中序中求出C的左子樹(shù):D,右子樹(shù):E;

后序中求出樹(shù)A的右子樹(shù)FHG根節(jié)點(diǎn):F;

中序中求出F的左子樹(shù):空,右子樹(shù):HG;

先序中求出樹(shù)HG的根節(jié)點(diǎn):G;

中序中求出節(jié)點(diǎn)G的左子樹(shù):H,右子樹(shù):空。

這樣還原出二叉樹(shù)和其先序如下圖:

~~~end~~~

這些是C/C++能做的

服務(wù)器開(kāi)發(fā)工程師、人工智能、云計(jì)算工程師、信息安全(黑客反黑客)、大數(shù)據(jù) 、數(shù)據(jù)平臺(tái)、嵌入式工程師、流媒體服務(wù)器、數(shù)據(jù)控解、圖像處理、音頻視頻開(kāi)發(fā)工程師、游戲服務(wù)器、分布式系統(tǒng)、游戲輔助等

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 樹(shù)的概述 樹(shù)是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹(shù)與前面介紹的線性表,棧,隊(duì)列等線性結(jié)構(gòu)不同,樹(shù)是一種非線性結(jié)構(gòu) 1.樹(shù)的定...
    Jack921閱讀 4,765評(píng)論 1 31
  • 一直以來(lái),我都很少使用也避免使用到樹(shù)和圖,總覺(jué)得它們神秘而又復(fù)雜,但是樹(shù)在一些運(yùn)算和查找中也不可避免的要使用到,那...
    24K男閱讀 6,862評(píng)論 5 14
  • 數(shù)據(jù)結(jié)構(gòu)和算法--二叉樹(shù)的實(shí)現(xiàn) 幾種二叉樹(shù) 1、二叉樹(shù) 和普通的樹(shù)相比,二叉樹(shù)有如下特點(diǎn): 每個(gè)結(jié)點(diǎn)最多只有兩棵子...
    sunhaiyu閱讀 6,705評(píng)論 0 14
  • 基于樹(shù)實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),具有兩個(gè)核心特征: 邏輯結(jié)構(gòu):數(shù)據(jù)元素之間具有層次關(guān)系; 數(shù)據(jù)運(yùn)算:操作方法具有Log級(jí)的平...
    yhthu閱讀 4,473評(píng)論 1 5
  • 好想有個(gè)自己的小窩,睡到自然醒,隨時(shí)外放音樂(lè),穿著內(nèi)衣起舞。廚房是我的,滿足吃貨的一切欲望。浴室是我的,在水霧繚繞...
    Grim777閱讀 133評(píng)論 0 0

友情鏈接更多精彩內(nèi)容