二叉樹的遍歷(前序 中序 后續(xù) 層次 深度優(yōu)先 廣度優(yōu)先)

書籍推薦

《大話數(shù)據(jù)結(jié)構(gòu)》——https://www.loneway.ren/book/20006

二叉樹的遍歷

二叉樹的遍歷方式有兩類:深度優(yōu)先遍歷和廣度優(yōu)先遍歷。

深度優(yōu)先遍歷

深度優(yōu)先遍歷是指順著某一條路徑盡可能的向前探索术唬,必要的時候(探索到葉子節(jié)點)回溯焚志。

遍歷順序:

  • 先根序遍歷(DLR)
  • 中根序遍歷(LDR)
  • 后根序遍歷(LRD)

實現(xiàn)方法:

  • 遞歸方法
    給定一個二叉樹朵栖,返回它的中序 遍歷责循。
    示例:

    輸入: [1,null,2,3]
       1
        \
         2
        /
       3

    輸出: [1,3,2]

    來源:力扣(LeetCode)
    鏈接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    class Solution(object):
        def inorderTraversal(self, root):
            """
            :type root: TreeNode
            :rtype: List[int]
            """
            assert isinstance(root, TreeNode). TypeError
            if not root:
                return []
            return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
  • 循環(huán)迭代方法
先根序遍歷(DLR):

    class Solution(object):
        def inorderTraversal(self, root):
            i = root
            result = []
            stack = []
            while i or stack: # 判斷整棵樹是否遍歷完成
                while i: # 判斷是否達(dá)到葉子節(jié)點
                    result.append(i.val) # 先遍歷根節(jié)點
                    stack.append(i.right) # 右子樹入棧撮珠,待會兒遍歷
                    i = i.left # 深入左子樹
                i = stack.pop() # 取出右子樹
            return result


中根序遍歷(LDR):

    class Solution(object):
        def inorderTraversal(self, root):
            i = root
            result = []
            stack = []
            while i or stack:
                while i:
                    stack.append(i)
                    i = i.left
                i = stack.pop()
                result.append(i.val)
                i = i.right
            return result

后根序遍歷(LRD):

    class Solution(object):
        def inorderTraversal(self, root):
            i = root
            result = []
            stack = []
            while i or stack:
                while i:
                    stack.append(i)
                    i = i.left or i.right
                i = stack.pop()
                result.append(i.val)
                if stack and i == stack[-1].left:
                    i = stack[-1].right
                else:
                    i = None
            return result

廣度優(yōu)先遍歷

廣度優(yōu)先遍歷是指在所有子樹路徑上齊頭并進(jìn)歌粥。

遍歷順序:

  • 層次遍歷

實現(xiàn)方法

  • 隊列循環(huán)迭代
    from Queue import Queue
    class Solution(object):
        def inorderTraversal(self, root):
            result = []
            q = Queue()
            q.input(root)
            while not q.empty():
                item = q.get()
                if item:
                    if item.left:
                        q.put(item.left)
                    if item.right:
                        q.put(item.right)
                    result.append(item.val)
            return result
  • 雙層列表迭代
    class Solution(object):
        def inorderTraversal(self, root):
            result = []
            if not root:
                return result
            cur_nodes = [root]
            while cur_nodes:
                sub_result = []
                next_nodes = []
                for node in cur_nodes:
                    if node:
                        sub_result.append(node.val)
                        if node.left:
                            next_nodes.append(node.left)
                        if node.right:
                            next_nodes.append(node.right)  
                result.append(sub_result)
                cur_nodes = next_nodes
            return result

問題變種

  • 根據(jù)先根序遍歷和中根序遍歷結(jié)果塌忽,恢復(fù)一顆二叉樹
    根據(jù)一棵樹的前序遍歷與中序遍歷構(gòu)造二叉樹。

    注意:
    你可以假設(shè)樹中沒有重復(fù)的元素失驶。

    例如土居,給出

    前序遍歷 preorder = [3,9,20,15,7]
    中序遍歷 inorder = [9,3,15,20,7]
    返回如下的二叉樹:

        3
       / \
      9  20
        /  \
       15   7


    來源:力扣(LeetCode)
    鏈接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None

    class Solution(object):
        def buildTree(self, preorder, inorder):
            """
            :type preorder: List[int]
            :type inorder: List[int]
            :rtype: TreeNode
            """
            if not preorder:
                return None
            root = TreeNode(preorder[0])
            mid = inorder.index(preorder[0])
            root.left = self.buildTree(preorder[1: mid+1], inorder[:mid])
            root.right = self.buildTree(preorder[mid+1:], inorder[mid+1:])
            return root
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嬉探,隨后出現(xiàn)的幾起案子擦耀,更是在濱河造成了極大的恐慌,老刑警劉巖涩堤,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眷蜓,死亡現(xiàn)場離奇詭異,居然都是意外死亡胎围,警方通過查閱死者的電腦和手機吁系,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門德召,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人汽纤,你說我怎么就攤上這事上岗。” “怎么了蕴坪?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵肴掷,是天一觀的道長。 經(jīng)常有香客問我背传,道長呆瞻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任续室,我火速辦了婚禮栋烤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挺狰。我一直安慰自己明郭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布丰泊。 她就那樣靜靜地躺著薯定,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞳购。 梳的紋絲不亂的頭發(fā)上话侄,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音学赛,去河邊找鬼年堆。 笑死,一個胖子當(dāng)著我的面吹牛盏浇,可吹牛的內(nèi)容都是我干的变丧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼绢掰,長吁一口氣:“原來是場噩夢啊……” “哼痒蓬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起滴劲,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤攻晒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后班挖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲁捏,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年萧芙,在試婚紗的時候發(fā)現(xiàn)自己被綠了碴萧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乙嘀。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡末购,死狀恐怖破喻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盟榴,我是刑警寧澤曹质,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站擎场,受9級特大地震影響羽德,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迅办,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一宅静、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧站欺,春花似錦姨夹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贾虽,卻和暖如春逃糟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蓬豁。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工绰咽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人地粪。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓取募,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驶忌。 傳聞我的和親對象是個殘疾皇子矛辕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360