python實現(xiàn)二叉樹的遍歷

二叉樹是一種非常重要的數(shù)據(jù)結(jié)構(gòu)丑念,很多其它數(shù)據(jù)結(jié)構(gòu)都是基于二叉樹的基礎(chǔ)演變而來的。對于二叉樹浪规,有深度遍歷和廣度遍歷或听,深度遍歷有前序、中序以及后序三種遍歷方法笋婿,廣度遍歷即我們平常所說的層次遍歷誉裆。因為樹的定義本身就是遞歸定義,因此采用遞歸的方法去實現(xiàn)樹的三種遍歷不僅容易理解而且代碼很簡潔缸濒,而對于廣度遍歷來說足丢,需要其他數(shù)據(jù)結(jié)構(gòu)的支撐,比如堆了庇配。所以斩跌,對于一段代碼來說,可讀性有時候要比代碼本身的效率要重要的多捞慌。

1.png

四種主要的遍歷思想為:
1耀鸦、深度優(yōu)先遍歷
前序遍歷:根結(jié)點 ---> 左子樹 ---> 右子樹 (中,左啸澡,右的遍歷順序)
中序遍歷:左子樹 ---> 根結(jié)點 ---> 右子樹 (左揭糕、中萝快、右的遍歷順序)
后序遍歷:左子樹 ---> 右子樹 ---> 根結(jié)點 (左、右著角、中的遍歷順序)
2揪漩、廣度優(yōu)先遍歷
層次遍歷:只需按層次遍歷即可
例如,求下面二叉樹的各種遍歷
遍歷的結(jié)果 :
前序遍歷:1 2 4 5 7 8 3 6
中序遍歷:4 2 7 5 8 1 3 6
后序遍歷:4 7 8 5 2 6 3 1
層次遍歷:1 2 3 4 5 6 7 8

python 的代碼實現(xiàn):

class TreeNode(object):
    #data:節(jié)點值
    #left:左子節(jié)點(默認為None)
    #right:右子節(jié)點(默認為None)
    def __init__(self,element=None,left=None,right=None):
        self.element=element
        self.left=left
        self.right=right
    def __str__(self):
        return str(self.element)
class Tree(object):
    #定義樹的類
    def __init__(self):
        self.root = TreeNode()
        self.myQueue = []
    def add_Treenode(self,element):
    #添加葉節(jié)點
        treenode = TreeNode(element)
        if self.root.element == None:
            #如果樹是空的就給書添加根節(jié)點
            self.root = treenode
            self.myQueue.append(self.root)
        else:
            #將子節(jié)點添加到列表的首位
            childNode = self.myQueue[0]
            if childNode.left == None:
                childNode.left = treenode
                self.myQueue.append(childNode.left)
            else:
                childNode.right = treenode
                self.myQueue.append(childNode.right)
                self.myQueue.pop(0)

    def front_digui(self,root):#前序遍歷
        if root == None:
            return
        print(root.element)
        self.front_digui(root.left)
        self.front_digui(root.right)

    def middle_digui(self,root):#中序遍歷
        if root == None:
            return
        self.middle_digui(root.left)
        print(root.element)
        self.middle_digui(root.right)

    def later_digui(self,root):#后序遍歷
        if root == None:
            return
        self.later_digui(root.left)
        self.later_digui(root.right)
        print root.element

    def level_queue(self, root):
        '''利用隊列實現(xiàn)樹的層次遍歷'''
        if root == None:
            return
        myQueue = []
        node = root
        myQueue.append(node)
        while myQueue:
            node = myQueue.pop(0)
            print node.element,
            if node.left != None:
                myQueue.append(node.left)
            if node.right != None:
                myQueue.append(node.right)

if __name__ == '__main__':
  """主函數(shù)"""
  elems = range(10)      #生成十個數(shù)據(jù)作為樹節(jié)點
  tree = Tree()     #新建一個樹對象
  for elem in elems:
    tree.add_Treenode(elem)      #逐個添加樹的節(jié)點
  print '隊列實現(xiàn)層次遍歷:'
  tree.level_queue(tree.root)
  print '\n\n遞歸實現(xiàn)先序遍歷:'
  tree.front_digui(tree.root)
  print '\n遞歸實現(xiàn)中序遍歷:'
  tree.middle_digui(tree.root)
  print '\n遞歸實現(xiàn)后序遍歷:'
  tree.later_digui(tree.root) 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吏口,一起剝皮案震驚了整個濱河市奄容,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌产徊,老刑警劉巖昂勒,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舟铜,居然都是意外死亡戈盈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門谆刨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塘娶,“玉大人,你說我怎么就攤上這事痊夭〉蟀叮” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵她我,是天一觀的道長虹曙。 經(jīng)常有香客問我,道長番舆,這世上最難降的妖魔是什么酝碳? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮恨狈,結(jié)果婚禮上疏哗,老公的妹妹穿的比我還像新娘。我一直安慰自己拴事,他們只是感情好沃斤,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布圣蝎。 她就那樣靜靜地躺著刃宵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪徘公。 梳的紋絲不亂的頭發(fā)上牲证,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音关面,去河邊找鬼坦袍。 笑死十厢,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的捂齐。 我是一名探鬼主播蛮放,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奠宜!你這毒婦竟也來了包颁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤压真,失蹤者是張志新(化名)和其女友劉穎娩嚼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滴肿,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡岳悟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泼差。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贵少。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拴驮,靈堂內(nèi)的尸體忽然破棺而出春瞬,到底是詐尸還是另有隱情,我是刑警寧澤套啤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布宽气,位于F島的核電站,受9級特大地震影響潜沦,放射性物質(zhì)發(fā)生泄漏萄涯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一唆鸡、第九天 我趴在偏房一處隱蔽的房頂上張望涝影。 院中可真熱鬧,春花似錦争占、人聲如沸燃逻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伯襟。三九已至,卻和暖如春握童,著一層夾襖步出監(jiān)牢的瞬間姆怪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稽揭,地道東北人俺附。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像溪掀,于是被迫代替她去往敵國和親事镣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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

  • 數(shù)據(jù)結(jié)構(gòu)和算法--二叉樹的實現(xiàn) 幾種二叉樹 1揪胃、二叉樹 和普通的樹相比蛮浑,二叉樹有如下特點: 每個結(jié)點最多只有兩棵子...
    sunhaiyu閱讀 6,459評論 0 14
  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹與前面介紹的線性表只嚣,棧沮稚,隊列等線性結(jié)構(gòu)不同,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,452評論 1 31
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結(jié)點至多有m個孩子册舞。 除根結(jié)點和葉子結(jié)點外蕴掏,其它每個結(jié)點至少有m...
    文檔隨手記閱讀 13,218評論 0 25
  • 樹和二叉樹 1、樹的定義 樹(Tree)是由一個 或 多個結(jié)點 組成的有限集合T调鲸,且滿足: ①有且僅有一個稱為根的...
    利伊奧克兒閱讀 1,366評論 0 1
  • 春色爛漫盛杰,花香醉人。撐一把油紙傘藐石,你在風光旖旎的山水之間踏足游春即供。 煙花四月,萬紫千紅于微。展翅的蜜蜂棲息在花心逗嫡,美麗...
    墨靈卷閱讀 302評論 0 1