兩種方式實現(xiàn)二叉樹遍歷(包含先序,中序,后序) 基于 Python2.x

#coding=utf-8

class Node(object):
    """節(jié)點類"""
    def __init__(self, elem=-1, lchild=None, rchild=None):
        self.elem = elem
        self.lchild = lchild
        self.rchild = rchild


class Tree(object):
    """樹類"""
    def __init__(self):
        self.root = Node()
        self.myQueue = []

    def add(self, elem):
        """為樹添加節(jié)點"""
        node = Node(elem=elem)
        if self.root.elem == -1:  # 如果樹是空的愿阐,則對根節(jié)點賦值
            self.root = node
            self.myQueue.append(self.root)
        else:
            treeNode = self.myQueue[0]  # 此結(jié)點的子樹還沒有齊竞穷。
            if treeNode.lchild == None:
                treeNode.lchild = node
                self.myQueue.append(treeNode.lchild)
            else:
                treeNode.rchild = node
                self.myQueue.append(treeNode.rchild)
                self.myQueue.pop(0)  # 如果該結(jié)點存在右子樹,將此結(jié)點丟棄。


    def front_digui(self, root):
        """
        利用遞歸實現(xiàn)樹的先序遍歷
        先序遍歷:根節(jié)點->左子樹->右子樹
        """
        if root == None:
            return
        print root.elem,
        self.front_digui(root.lchild)
        self.front_digui(root.rchild)


    def middle_digui(self, root):
        """
        利用遞歸實現(xiàn)樹的中序遍歷
        中序遍歷:左子樹->根節(jié)點->右子樹
        """
        if root == None:
            return
        self.middle_digui(root.lchild)
        print root.elem,
        self.middle_digui(root.rchild)


    def later_digui(self, root):
        """
         利用遞歸實現(xiàn)樹的后序遍歷
         后序遍歷:左子樹->右子樹->根節(jié)點
        """
        if root == None:
            return
        self.later_digui(root.lchild)
        self.later_digui(root.rchild)
        print root.elem,


    def front_stack(self, root):
        """利用堆棧實現(xiàn)樹的先序遍歷"""
        if root == None:
            return
        myStack = []
        node = root
        while node or myStack:
            while node:                     #從根節(jié)點開始,一直找它的左子樹
                print node.elem,
                myStack.append(node)
                node = node.lchild
            node = myStack.pop()            #while結(jié)束表示當前節(jié)點node為空,即前一個節(jié)點沒有左子樹了
            node = node.rchild                  #開始查看它的右子樹


    def middle_stack(self, root):
        """利用堆棧實現(xiàn)樹的中序遍歷"""
        if root == None:
            return
        myStack = []
        node = root
        while node or myStack:
            while node:                     #從根節(jié)點開始,一直找它的左子樹
                myStack.append(node)
                node = node.lchild
            node = myStack.pop()            #while結(jié)束表示當前節(jié)點node為空沟优,即前一個節(jié)點沒有左子樹了
            print node.elem,
            node = node.rchild                  #開始查看它的右子樹


    def later_stack(self, root):
        """利用堆棧實現(xiàn)樹的后序遍歷"""
        if root == None:
            return
        myStack1 = []
        myStack2 = []
        node = root
        myStack1.append(node)
        while myStack1:                   #這個while循環(huán)的功能是找出后序遍歷的逆序,存在myStack2里面
            node = myStack1.pop()
            if node.lchild:
                myStack1.append(node.lchild)
            if node.rchild:
                myStack1.append(node.rchild)
            myStack2.append(node)
        while myStack2:                         #將myStack2中的元素出棧睬辐,即為后序遍歷次序
            print myStack2.pop().elem,


    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.elem,
            if node.lchild != None:
                myQueue.append(node.lchild)
            if node.rchild != None:
                myQueue.append(node.rchild)


if __name__ == '__main__':
    """主函數(shù)"""
    elems = range(10)           #生成十個數(shù)據(jù)作為樹節(jié)點
    tree = Tree()          #新建一個樹對象
    for elem in elems:                  
        tree.add(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)

    print '\n\n堆棧實現(xiàn)先序遍歷:'
    tree.front_stack(tree.root)
    print '\n堆棧實現(xiàn)中序遍歷:'
    tree.middle_stack(tree.root)
    print '\n堆棧實現(xiàn)后序遍歷:'
    tree.later_stack(tree.root)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挠阁,一起剝皮案震驚了整個濱河市宾肺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侵俗,老刑警劉巖锨用,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異隘谣,居然都是意外死亡黔酥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門洪橘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棵帽,你說我怎么就攤上這事熄求。” “怎么了逗概?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵弟晚,是天一觀的道長。 經(jīng)常有香客問我逾苫,道長卿城,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任铅搓,我火速辦了婚禮瑟押,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘星掰。我一直安慰自己多望,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布氢烘。 她就那樣靜靜地躺著怀偷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪播玖。 梳的紋絲不亂的頭發(fā)上椎工,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音蜀踏,去河邊找鬼维蒙。 笑死,一個胖子當著我的面吹牛果覆,可吹牛的內(nèi)容都是我干的木西。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼随静,長吁一口氣:“原來是場噩夢啊……” “哼八千!你這毒婦竟也來了吗讶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤恋捆,失蹤者是張志新(化名)和其女友劉穎照皆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沸停,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡膜毁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了愤钾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘟滨。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖能颁,靈堂內(nèi)的尸體忽然破棺而出杂瘸,到底是詐尸還是另有隱情,我是刑警寧澤伙菊,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布败玉,位于F島的核電站,受9級特大地震影響镜硕,放射性物質(zhì)發(fā)生泄漏运翼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一兴枯、第九天 我趴在偏房一處隱蔽的房頂上張望血淌。 院中可真熱鬧,春花似錦财剖、人聲如沸六剥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疗疟。三九已至,卻和暖如春瞳氓,著一層夾襖步出監(jiān)牢的瞬間策彤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工匣摘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留店诗,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓音榜,卻偏偏與公主長得像庞瘸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赠叼,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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