數(shù)據(jù)結(jié)構(gòu)-二叉樹(1)以及前序、中序入热、后序遍歷(python實現(xiàn))

上篇文章我們介紹了樹的概念拍棕,今天我們來介紹一種特殊的樹——二叉樹,二叉樹的應(yīng)用很廣勺良,有很多特性绰播。今天我們一一來為大家介紹。

二叉樹

顧名思義尚困,二叉樹就是只有兩個節(jié)點的樹蠢箩,兩個節(jié)點分別為左節(jié)點和右節(jié)點,特別強(qiáng)調(diào)事甜,即使只有一個子節(jié)點也要區(qū)分它是左節(jié)點還是右節(jié)點谬泌。

常見的二叉樹有一般二叉樹、完全二叉樹逻谦、滿二叉樹掌实、線索二叉樹、霍夫曼樹邦马、二叉排序樹贱鼻、平衡二叉樹、紅黑樹滋将、B樹這么多種類邻悬。我們這篇文章中簡單介紹一般二叉樹、完全二叉樹和滿二叉樹随闽。

一般二叉樹

很簡單拘悦,只要滿足子節(jié)點數(shù)不超過兩個的樹就是一棵二叉樹。長這樣:

二叉樹

滿二叉樹

滿二叉樹在一般二叉樹的基礎(chǔ)上要求除了最后一層的節(jié)點之外橱脸,每一個節(jié)點都必須有兩個子節(jié)點础米。

滿二叉樹

完全二叉樹

完全二叉樹要求從第一層到倒數(shù)第二層組成的樹是一顆滿二叉樹,最后一層的節(jié)點要滿足從左往右排列添诉。

完全二叉樹

好屁桑,關(guān)于二叉樹的概念,我們就介紹到這里栏赴,下面我們來介紹二叉樹的前序蘑斧、中序、后序遍歷。

在此之前呢竖瘾,我們先創(chuàng)建一顆二叉樹:

class BinaryTree:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

    def get(self):
        return self.data

    def getLeft(self):
        return self.left

    def getRight(self):
        return self.right

    def setLeft(self, node):
        self.left = node

    def setRight(self, node):
        self.right = node

好沟突,這里我們定義好了一個二叉樹類,并給它添加了一下方法捕传,然后我們來實例化一顆二叉樹:

binaryTree = BinaryTree(0)
binaryTree.setLeft(BinaryTree(1))
binaryTree.setRight(BinaryTree(2))
binaryTree.getLeft().setLeft(BinaryTree(3))
binaryTree.getLeft().setRight(BinaryTree(4))
binaryTree.getRight().setLeft(BinaryTree(5))
binaryTree.getRight().setRight(BinaryTree(6))

實例化好的二叉樹是長這個樣子的:

image

前序遍歷

接下來惠拭,我們對這棵樹進(jìn)行前序遍歷。在此之前庸论,我們介紹一下什么是前序遍歷职辅。

前面我們介紹過了樹的深度優(yōu)先遍歷和廣度優(yōu)先遍歷,這里就不再贅述了聂示。

前序遍歷的順序就是先遍歷樹的父節(jié)點域携,然后遍歷樹的左節(jié)點,然后遍歷樹的右節(jié)點鱼喉,以此類推秀鞭。

對于我們上面定義好的二叉樹來說,它的前序遍歷結(jié)果就是:0 -> 1 -> 3 -> 4 -> 2 -> 5 -> 6

對于前序扛禽、中序锋边、后序遍歷來說,采用遞歸的方式是非常方便的旋圆。這里我們就用遞歸來實現(xiàn)一下:

def preorderTraversal(now, result=[]):
    if now == None:
        return result
    result.append(now.data)
    preorderTraversal(now.left, result)
    preorderTraversal(now.right, result)
    return result


print(preorderTraversal(binaryTree))

執(zhí)行結(jié)果:[0, 1, 3, 4, 2, 5, 6],是不是和我們之前手動遍歷的結(jié)果一樣呢麸恍。

中序遍歷

中序遍歷的順序是:先遍歷樹的左節(jié)點灵巧,再遍歷樹的父節(jié)點,再遍歷樹的右節(jié)點抹沪。

對于我們上面創(chuàng)建的二叉樹刻肄,它的中序遍歷結(jié)果就是:3 -> 1 -> 4 -> 0 -> 5 -> 2 -> 6

在前序遍歷的時候是先遍歷父節(jié)點,所以result.append(now.data)融欧,就在遍歷左節(jié)點和右節(jié)點的前面敏弃。

而中序遍歷要先遍歷左節(jié)點,所以result.append(now.data)就要在遍歷左節(jié)點的后面噪馏,遍歷右節(jié)點的前面麦到。

def intermediateTraversal(now, result=[]):
    if now == None:
        return result
    intermediateTraversal(now.left, result)
    result.append(now.data)
    intermediateTraversal(now.right, result)
    return result


print(intermediateTraversal(binaryTree))

執(zhí)行結(jié)果:[3, 1, 4, 0, 5, 2, 6]

后序遍歷

后序遍歷順序是:先遍歷樹的左節(jié)點,再遍歷樹的右節(jié)點欠肾,再遍歷樹的父節(jié)點瓶颠。

對于我們上面創(chuàng)建的二叉樹,它的后序遍歷結(jié)果是:3 -> 4 -> 1 -> 5 -> 6 -> 2 -> 0

相應(yīng)的遞歸方程為:

def postorderTraversal(now, result=[]):
    if now == None:
        return
    postorderTraversal(now.left, result)
    postorderTraversal(now.right, result)
    result.append(now.data)
    return result

print(postorderTraversal(binaryTree))

執(zhí)行結(jié)果:[3, 4, 1, 5, 6, 2, 0]

好刺桃,今天我們關(guān)于二叉樹的三序遍歷就介紹到這里了粹淋,接下來我們會接著介紹更多的二叉樹類型以及應(yīng)用,記得關(guān)注我的文章。關(guān)于三序遍歷桃移,你還有其他的實現(xiàn)方法嗎屋匕,留言告訴我們把。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末借杰,一起剝皮案震驚了整個濱河市过吻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌第步,老刑警劉巖疮装,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粘都,居然都是意外死亡廓推,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門翩隧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來樊展,“玉大人,你說我怎么就攤上這事堆生∽ú” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵淑仆,是天一觀的道長涝婉。 經(jīng)常有香客問我,道長蔗怠,這世上最難降的妖魔是什么墩弯? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮寞射,結(jié)果婚禮上渔工,老公的妹妹穿的比我還像新娘。我一直安慰自己桥温,他們只是感情好引矩,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侵浸,像睡著了一般旺韭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掏觉,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天茂翔,我揣著相機(jī)與錄音,去河邊找鬼履腋。 笑死珊燎,一個胖子當(dāng)著我的面吹牛惭嚣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悔政,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼晚吞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谋国?” 一聲冷哼從身側(cè)響起槽地,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芦瘾,沒想到半個月后捌蚊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡近弟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年缅糟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祷愉。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡窗宦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出二鳄,到底是詐尸還是另有隱情赴涵,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布订讼,位于F島的核電站髓窜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏欺殿。R本人自食惡果不足惜寄纵,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祈餐。 院中可真熱鬧擂啥,春花似錦哄陶、人聲如沸帆阳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜒谤。三九已至,卻和暖如春至扰,著一層夾襖步出監(jiān)牢的瞬間鳍徽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工敢课, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留阶祭,地道東北人绷杜。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像濒募,于是被迫代替她去往敵國和親鞭盟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

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