二叉樹

'# -*- coding: utf-8 -*-'
'# 節(jié)點(diǎn)類' 
class Node(object):
    def __init__(self, data=None, lchild=None, rchild=None):
        self.data = data
        self.lchild = lchild
        self.rchild = rchild
'# 二叉樹類'
class Bitree(object):
    def __init__(self):
        self.root = Node()
        self.myqueue = []

    # 添加節(jié)點(diǎn)(利用隊(duì)列來實(shí)現(xiàn),判斷節(jié)點(diǎn)的左右子樹是否有值约炎,沒值賦值后并將左右節(jié)點(diǎn)添加到隊(duì)列中偷办,若右節(jié)點(diǎn),將該節(jié)點(diǎn)從隊(duì)列中移除
    def addnode(self, value):
        node = Node(value)
        if self.root.data is None:   # 如果樹是空的,則對根節(jié)點(diǎn)賦值
            self.root = node
            self.myqueue.append(self.root)
        else:
            treenode = self.myqueue[0]   # 此節(jié)點(diǎn)的子樹還不完全
            if treenode.lchild is None:
                treenode.lchild = node
                self.myqueue.append(treenode.lchild)
            else:
                treenode.rchild = node
                self.myqueue.append(treenode.rchild)
                self.myqueue.pop(0)        # 經(jīng)歷過給右節(jié)點(diǎn)賦值仆抵,該節(jié)點(diǎn)一定是完全的巩割,故從列表中pop出(隊(duì)列,先進(jìn)先出)

    # 利用遞歸實(shí)現(xiàn)先序遍歷二叉樹
    def preorder_re(self, root):
        if root is None:
            return
        else:
            # 遍歷順序?yàn)椤案笥摇?            print(root.data, end=' ')
            self.preorder_re(root.lchild)
            self.preorder_re(root.rchild)

    # 利用遞歸實(shí)現(xiàn)中序遍歷二叉樹
    def inorder_re(self, root):
        if root is None:
            return
        else:
            # 遍歷順序?yàn)椤白蟾摇?            self.inorder_re(root.lchild)
            print(root.data, end=' ')
            self.inorder_re(root.rchild)

    # 利用遞歸實(shí)現(xiàn)后序遍歷二叉樹
    def backorder_re(self, root):
        if root is None:
            return
        else:
            # 遍歷順序?yàn)椤白笥腋?            self.backorder_re(root.lchild)
            self.backorder_re(root.rchild)
            print(root.data, end=' ')

    # 利用堆棧實(shí)現(xiàn)先序遍歷二叉樹亭珍,棧的特點(diǎn)先進(jìn)后出
    def preorder_stack(self, root):
        if root is None:
            return
        node = root
        mystack = []
        while node or mystack:             # 當(dāng)椃蠹兀空,則代表所有節(jié)點(diǎn)都已遍歷完
            while node:
                print(node.data, end=' ')
                mystack.append(node)   # 將節(jié)點(diǎn)添加到棧中
                node = node.lchild    # 將節(jié)點(diǎn)的左節(jié)點(diǎn)當(dāng)作父節(jié)點(diǎn)肄梨,繼續(xù)循環(huán)阻荒,找出所有左節(jié)點(diǎn),并添加到棧中众羡,while循環(huán)結(jié)束表示當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)沒有左子樹
            node = mystack.pop()     # 將沒有左節(jié)點(diǎn)的pop出
            node = node.rchild       # 左子樹遍歷完侨赡,開始遍歷右子樹

    # 利用堆棧實(shí)現(xiàn)中序遍歷二叉樹
    def inorder_stack(self, root):
        if root is None:
            return
        node = root
        mystack = []
        while node or mystack:
            while node:
                mystack.append(node)
                node = node.lchild    # 這個(gè)while循環(huán)是為了找左子樹為空的節(jié)點(diǎn)
            node = mystack.pop()     # 左
            print(node.data, end=' ')  # 根
            node = node.rchild         # 右

    # 利用堆棧實(shí)現(xiàn)后序二叉樹遍歷
    def backorder_stack(self, root):
        if root is None:
            return
        node = root
        mystack1 = []
        mystack2 = []
        mystack1.append(node)
        while mystack1:                        # 找出后序遍歷的逆序,并存入mystack2中
            node = mystack1.pop()
            if node.lchild is not None:
                mystack1.append(node.lchild)
            if node.rchild is not None:
                mystack1.append(node.rchild)
            mystack2.append(node)
        while mystack2:
            print(mystack2.pop().data, end=' ')     # 逆序輸出

    # 利用隊(duì)列實(shí)現(xiàn)二叉樹的層次遍歷
    def level_queue(self, root):
        if root is None:
            return
        myqueue = []
        node = root
        myqueue.append(node)
        while myqueue:
            node = myqueue.pop(0)  # 先進(jìn)先出
            print(node.data, end=' ')
            if node.lchild is not None:
                myqueue.append(node.lchild)
            if node.rchild is not None:
                myqueue.append(node.rchild)
s
if __name__ == '__main__':
   
    elems = range(10)  # 生成十個(gè)數(shù)據(jù)作為樹節(jié)點(diǎn)
    tree = Bitree()  # 新建一個(gè)樹對象
    for elem in elems:
        tree.addnode(elem)  # 逐個(gè)添加樹的節(jié)點(diǎn)
    print('隊(duì)列實(shí)現(xiàn)層次遍歷:')
    tree.level_queue(tree.root)
    print('\n\n遞歸實(shí)現(xiàn)先序遍歷:')
    tree.preorder_re(tree.root)
    print('\n遞歸實(shí)現(xiàn)中序遍歷:')
    tree.inorder_re(tree.root)
    print('\n遞歸實(shí)現(xiàn)后序遍歷:')
    tree.backorder_re(tree.root)
    print('\n\n堆棧實(shí)現(xiàn)先序遍歷:')
    tree.preorder_stack(tree.root)
    print('\n堆棧實(shí)現(xiàn)中序遍歷:')
    tree.inorder_stack(tree.root)
    print('\n堆棧實(shí)現(xiàn)后序遍歷:')
    tree.backorder_stack(tree.root)
'''
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辆毡,隨后出現(xiàn)的幾起案子菜秦,更是在濱河造成了極大的恐慌,老刑警劉巖舶掖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件球昨,死亡現(xiàn)場離奇詭異,居然都是意外死亡眨攘,警方通過查閱死者的電腦和手機(jī)主慰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲫售,“玉大人共螺,你說我怎么就攤上這事∏橹瘢” “怎么了藐不?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秦效。 經(jīng)常有香客問我雏蛮,道長,這世上最難降的妖魔是什么阱州? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任挑秉,我火速辦了婚禮,結(jié)果婚禮上苔货,老公的妹妹穿的比我還像新娘犀概。我一直安慰自己,他們只是感情好夜惭,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布姻灶。 她就那樣靜靜地躺著,像睡著了一般滥嘴。 火紅的嫁衣襯著肌膚如雪木蹬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天若皱,我揣著相機(jī)與錄音镊叁,去河邊找鬼。 笑死走触,一個(gè)胖子當(dāng)著我的面吹牛晦譬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播互广,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼敛腌,長吁一口氣:“原來是場噩夢啊……” “哼卧土!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起像樊,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤尤莺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后生棍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颤霎,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年涂滴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了友酱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柔纵,死狀恐怖缔杉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搁料,我是刑警寧澤或详,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站加缘,受9級特大地震影響鸭叙,放射性物質(zhì)發(fā)生泄漏觉啊。R本人自食惡果不足惜拣宏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杠人。 院中可真熱鬧勋乾,春花似錦、人聲如沸嗡善。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罩引。三九已至各吨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袁铐,已是汗流浹背揭蜒。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剔桨,地道東北人屉更。 一個(gè)月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像洒缀,于是被迫代替她去往敵國和親瑰谜。 傳聞我的和親對象是個(gè)殘疾皇子欺冀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

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