二叉樹的遍歷

首先是三種遍歷的遞歸實現(xiàn)蟀给,思路簡單礼殊,重要的是要清楚每種遍歷的順序:

  1. 先序遍歷: 根 --》 左子樹 --》右子樹
  2. 中序遍歷: 左子樹 --》根--》右子樹
  3. 后序遍歷: 左子樹 --》右子樹 --》根

首先是樹的創(chuàng)建:


image.png
class binaryTree:
    def __init__(self, root):
        self.key = root
        self.left_child = None
        self.right_child = None
    def insert_left(self, new_node):
        if self.left_child == None:
            self.left_child = binaryTree(new_node)
        else:
            t = binaryTree(new_node)
            t.left_child = self.left_child
            self.left_child = t
    def insert_right(self, new_code):
        if self.right_child == None:
            self.right_child = binaryTree(new_code)
        else:
            t = binaryTree(new_code)
            t.right_child = self.right_child
            self.right_child = t
    def get_right_child(self):
        return self.right_child
    def get_left_child(self):
        return self.left_child
    def set_root_val(self, obj):
        self.key = obj
    def get_root_val(self):
        return self.key

遞歸方法:

def preOrder(root):
   if root == None:
       return
   print root.key,
   preOrder(root.left_child)
   preOrder(root.right_child)

def inOrder(root):
   if root == None:
       return
   inOrder(root.left_child)
   print root.key,
   inOrder(root.right_child)

def postOrder(root):
   if root == None:
       return
   postOrder(root.left_child)
   postOrder(root.right_child)
   print root.key,

層次遍歷:

def cengci(root):
    if root == None:
        return
    stack = []
    stack.append(root)
    while len(stack):
        p = stack[0]
        print p.key ,
        del stack[0]
        if p.left_child:
            stack.append(p.left_child)
        if p.right_child:
            stack.append(p.right_child)

測試:

if __name__ == "__main__":
    r = binaryTree('a')
    r.insert_left('b')
    r.insert_right('c')
    l = r.left_child
    l.insert_left("d")
    l.insert_right("e")
    ri = r.right_child
    ri.insert_left("f")
    ri.insert_right("g")
    print "pre: "
    preOrder(r)
    print "\n"
    print "in: "
    inOrder(r)
    print "\n"
    print "post: "
    postOrder(r)
image.png

非遞歸方法:

  1. 先序遍歷:
    當p或者棧不為空時循環(huán),為什么是這個條件(p很可能為None,但如果此時還能回溯的時候语婴,程序就可以繼續(xù))牍白,首先一直壓入左節(jié)點首有,(對應(yīng)根節(jié)點)并且輸出當前節(jié)點,當直到最左的時候俏橘,回溯(對應(yīng)pop操作)允华,考慮右節(jié)點
def preOrder1(root):
    if root == None:
        return
    p = root
    stack = []
    while p != None or len(stack):
        while p != None:
            print p.key,
            stack.append(p)
            p = p.left_child
        if len(stack):
            p = stack[-1]
            del stack[-1]
        p = p.right_child
  1. 中序遍歷,和前序遍歷有點像寥掐,但是因為根是在中間遍歷靴寂,所以要在出棧時候輸出(相當于根節(jié)點被壓棧了),最后考慮右節(jié)點
def inOrder1(root):
    if root == None:
        return
    p = root
    stack = []
    while p != None or len(stack):
        while p != None:
            stack.append(p)
            p = p.left_child
        if len(stack):
            p = stack[-1]
            print p.key,
            del stack[-1]
        p = p.right_child
  1. 后序遍歷:
    左--》右--》根
    當左節(jié)點和右節(jié)點不存在時召耘,可以訪問根節(jié)點百炬,或者左節(jié)點或者右節(jié)點已經(jīng)訪問過的時候。
    然后先壓棧右節(jié)點污它,然后左節(jié)點剖踊,這樣輸出的時候先左節(jié)點,后右節(jié)點
def postOrder1(root):
    if root == None:
        return
    p = root
    stack = []
    stack.append(p)
    pre = None
    while len(stack):
        cur = stack[-1]
        if (cur.left_child == None and cur.right_child == None) or (pre!=None and (pre == cur.left_child or pre == cur.right_child)):
            print cur.key,
            del stack[-1]
            pre = cur
        else:
            if cur.right_child != None:
                stack.append(cur.right_child)
            if cur.left_child != None:
                stack.append(cur.left_child)
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衫贬,一起剝皮案震驚了整個濱河市德澈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌固惯,老刑警劉巖梆造,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異葬毫,居然都是意外死亡镇辉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門贴捡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摊聋,“玉大人,你說我怎么就攤上這事栈暇÷椴茫” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長煎源。 經(jīng)常有香客問我色迂,道長,這世上最難降的妖魔是什么手销? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任歇僧,我火速辦了婚禮,結(jié)果婚禮上锋拖,老公的妹妹穿的比我還像新娘诈悍。我一直安慰自己,他們只是感情好兽埃,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布侥钳。 她就那樣靜靜地躺著,像睡著了一般柄错。 火紅的嫁衣襯著肌膚如雪舷夺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天售貌,我揣著相機與錄音给猾,去河邊找鬼。 笑死颂跨,一個胖子當著我的面吹牛敢伸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恒削,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼详拙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蔓同?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蹲诀,失蹤者是張志新(化名)和其女友劉穎斑粱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脯爪,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡则北,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了痕慢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尚揣。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掖举,靈堂內(nèi)的尸體忽然破棺而出快骗,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布方篮,位于F島的核電站名秀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏藕溅。R本人自食惡果不足惜匕得,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巾表。 院中可真熱鬧汁掠,春花似錦、人聲如沸集币。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惠猿。三九已至羔砾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間偶妖,已是汗流浹背姜凄。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趾访,地道東北人态秧。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像扼鞋,于是被迫代替她去往敵國和親申鱼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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