二叉樹遍歷總結(jié)(未完待續(xù)...)

leetcode上對于二叉樹遍歷有如下幾種類型的題目:

Binary Tree Preorder Traversal
Binary Tree Inorder Traversal
Binary Tree Postorder Traversal

1、二叉樹前序遍歷(遞歸):
  • 思想:對于前序遍歷先遍歷根缀去,隨后遍歷左子樹侣灶,最后遍歷右子樹
# 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 preorderTraversal(self, root):
        
        :type root: TreeNode
        :rtype: List[int]
        return self.preorder(root, [])

    def preorder(self, root, res):
        # 先遍歷根,隨后左子樹缕碎,最后右子樹
        if root == None:
            return res
        res.append(root.val)
        self.preorder(root.left, res)
        self.preorder(root.right, res)
        return res
    ```

#####2褥影、二叉樹中序遍歷(遞歸):
  -  思想:先遍歷左子樹 ,隨后遍歷根咏雌,最后右子樹

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]
"""
return self.inorder(root, [])

def inorder(self, root, res):
    # 中序遍歷凡怎,先遍歷左子樹,然后遍歷根赊抖,最后是右子樹
    if root == None:
        return res
    self.inorder(root.left, res)
    res.append(root.val)
    self.inorder(root.right, res)
    return res

#####3统倒、二叉樹后序遍歷(遞歸):
  -  思想:先遍歷左子樹,隨后遍歷右子樹氛雪,最后遍歷根

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 postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
return self.postorder(root, [])

def postorder(self, root, res):
    # 前序遍歷房匆,先遍歷左子樹,隨后是右子樹,最后遍歷根
    if root == None:
        return res
    self.postorder(root.left, res)
    self.postorder(root.right, res)
    res.append(root.val)
    return res

#####4浴鸿、二叉樹前序遍歷(非遞歸):
- 維護一個棧stack和當前結(jié)點root井氢,訪問當前結(jié)點
- **只要root的左子樹不為空**,將root入棧岳链,同時root左子樹成為新的當前結(jié)點
- 左子樹為空時花竞,將棧的第一個結(jié)點pop,并且當前結(jié)點設(shè)為pop出來結(jié)點的右子樹
- 循環(huán)上述幾個步驟,直到棧為空

class Solution(object):
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
res, stack = [],[]
while 1:
while root:
res.append(root.val)
stack.append(root)
root = root.left #左子樹成為新的root
if not stack:
# 棧為空返回
return res
root = stack.pop()
root = root.right #左子樹為空掸哑,開始遍歷右子樹

#####5约急、二叉樹中序遍歷(非遞歸):
-維護一個棧stack和當前結(jié)點root
- 只要root的左子樹不為空,將root入棧苗分,同時root左子樹成為新的當前結(jié)點
- 左子樹為空時厌蔽,將棧的第一個結(jié)點pop,同時訪問改pop結(jié)點,并且當前結(jié)點設(shè)為pop出來結(jié)點的右子樹
- 循環(huán)上述幾個步驟摔癣,直到棧為空

class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
res,stack = [],[]
while 1:
while root:
stack.append(root) #左子樹不為空入棧
root = root.left # 左子樹成為新的root
if not stack:
return res
root = stack.pop()
res.append(root.val) #先遍歷左子樹
root = root.right


#####6.1躺枕、二叉樹后序遍歷(非遞歸)- two stack:
- 維護兩個棧stack1,stack2,將root先入棧stack1
- 棧頂出棧壓入stack2, 同時將棧頂元素的左右子樹依次壓入stack1
- 循環(huán)上述操作供填,直到stack1為空
- 最后依次pop  stack2中的元素即可得到最終結(jié)果

class Solution(object):
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
# 維護兩個棧stack1,stack2,將根結(jié)點先進行入棧stack1
# 取出棧頂元素,并壓入stack2
# 同時將棧頂元素的左右子樹依次入stack1
# 循環(huán)上述步驟直到stack1為空
if not root:
return []
stack1,stack2 = [],[]
stack1.append(root)
while stack1:
root = stack1.pop()
stack2.append(root)
if root.left:
stack1.append(root.left)
if root.right:
stack1.append(root.right)
# return [stack2[i].val for i in range(len(stack2)-1,-1,-1)]
return [root.val for root in stack2[::-1]]

#####6.2罢猪、二叉樹后序遍歷(非遞歸)- one stack:
- 維護一個棧stack, 當前結(jié)點root, **前一結(jié)點pre(初始為空)**, 先將root入棧
- 如果當前結(jié)點的左右子樹為空近她,或當前結(jié)點有左子樹或者右子樹,但是左或右子樹已經(jīng)被訪問過膳帕,則可以訪問該結(jié)點
- 如果不是上述情況粘捎,將當前結(jié)點的右孩子和左孩子依次入棧,這樣可以保證每次訪問時危彩,左子樹都先被訪問


class Solution(object):
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
res, stack, pre = [],[],None
stack.append(root) #根先入棧
if not root:
# root為空
return []
while stack:
# stack 非空
root = stack[-1] # 取棧頂元素
if (root.left == None and root.right == None) or (pre != None and (root.left == pre or root.right == pre)):
res.append(root.val)
stack.pop()
pre = root
else:
if root.right:
stack.append(root.right)
if root.left:
stack.append(root.left)
return res


參考資料:
[1] http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攒磨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子汤徽,更是在濱河造成了極大的恐慌娩缰,老刑警劉巖几苍,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慰丛,死亡現(xiàn)場離奇詭異走净,居然都是意外死亡桦沉,警方通過查閱死者的電腦和手機嘴秸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門审姓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廷雅,“玉大人奏纪,你說我怎么就攤上這事壳鹤∈⒘洌” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長余舶。 經(jīng)常有香客問我啊鸭,道長,這世上最難降的妖魔是什么欧芽? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任莉掂,我火速辦了婚禮,結(jié)果婚禮上千扔,老公的妹妹穿的比我還像新娘憎妙。我一直安慰自己,他們只是感情好曲楚,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布厘唾。 她就那樣靜靜地躺著,像睡著了一般龙誊。 火紅的嫁衣襯著肌膚如雪抚垃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天趟大,我揣著相機與錄音鹤树,去河邊找鬼。 笑死逊朽,一個胖子當著我的面吹牛罕伯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叽讳,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼追他,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了岛蚤?” 一聲冷哼從身側(cè)響起邑狸,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涤妒,沒想到半個月后单雾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡届腐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年铁坎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犁苏。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡硬萍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出围详,到底是詐尸還是另有隱情朴乖,我是刑警寧澤祖屏,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站买羞,受9級特大地震影響袁勺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜畜普,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一期丰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吃挑,春花似錦钝荡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逛犹,卻和暖如春端辱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虽画。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工舞蔽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人码撰。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓喷鸽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灸拍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

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