二叉樹遍歷

總結(jié)一下二叉樹的深度遍歷(DFS)和廣度遍歷(BFS)
首先寝志, 創(chuàng)建二叉樹的節(jié)點:

class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

一、深度遍歷

1.1 先序遍歷(根->左->右)

class Solution(object):
    def preorderTraveral1(self, root):
        "遞歸法"
        q = []
        def recur(root):
            if root is None:
                return None
            q.append(root)
            recur(root.left)
            recur(root.right)
        recur(root)

        return q
    def  preorderTraveral2(self, root):
        """
        迭代法:利用兩個stack來儲存節(jié)點滔灶。
        當(dāng)遍歷開始時牧牢,將二叉樹左節(jié)點的元素依次放入output中纸兔,
        同時用stack儲存每一個節(jié)點的右節(jié)點。當(dāng)左邊節(jié)點遍歷完
        之后诸迟,從stack中依次取出右節(jié)點茸炒,放入output中,直到stack
        中沒有節(jié)點阵苇,遍歷結(jié)束壁公。
        """
        if root is None:
            return []
        stack = []
        output = []
        cur = root
        while stack or cur:
            if cur:
                output.append(root.var)
                stack.append(root.right)
                cur = cur.left
            else:
                cur = stack.pop()
        return output

1.2 中序遍歷(左->根->右)

class Solution(object):
    def inorderTraveral1(self, root):
        "遞歸法"
        q = []
        def recur(root):
            if root == None:
                return None
            recur(root.left)
            q.append(root.val)
            recur(root.right)
        recur(root)

        return q

    def  inorderTraveral2(self, root):
        """
        迭代法:利用兩個stack來儲存節(jié)點。
        遍歷開始時绅项, 將左節(jié)點依次放入stack中暫時存儲紊册,
        當(dāng)左節(jié)點為空時,從stack中取出一個節(jié)點放入output
        中快耿, 然后檢查當(dāng)前節(jié)點的右節(jié)點囊陡,右節(jié)點不為空, 
        將其放入output中掀亥,否則繼續(xù)從stack中取出節(jié)點撞反,然
        后循環(huán)遍歷,一直到stack中沒有節(jié)點為止搪花,循環(huán)結(jié)束
        """
        if root is None:
            return []
        stack = []
        output = []
        cur = root
        while cur or stack:
            if cur:
                stack.append(root)
                cur = cur.left
            else:
                cur = stack.pop()
                output.append(cur.var)
                cur = cur.right
        return output

1.3 后序遍歷(左->右->根)

class Solution(object):
    def portorderTraveral1(self, root):
        "遞歸法"
        q = []
        def recur(root):
            if root == None:
                return None
            recur(root.left)
            recur(root.right)
            q.append(root.var)
        recur(root)

        return q

    def  postorderTraveral2(self, root):
        """
        迭代法:利用兩個stack來儲存節(jié)點痢畜。
        后序遍歷:左/右/根垛膝,反過來是:根/右/左鳍侣, 這跟先序遍歷類似
        """
        if root is None:
            return []
        stack = []
        output = []
        cur = root
        while stack or cur:
            if cur:
                output.append(cur.var)
                stack.append(cur.left)
                cur = cur.right
            else:
                stack.pop()
        return output[::-1]

二丁稀、廣度遍歷

class Solution(object):
    def breadthTraveral(self, root):
        """
        迭代法
        利用隊列實現(xiàn)二叉樹的層次遍歷
        """
        if root is None:
            return []
        q = []
        output = []
        q.append(root)
        while q:
            cur = q.pop(0)
            output.append(cur.var)
            if cur.left != None:
                q.append(cur.left)
            if cur.right != None:
                q.append(cur.right)
        return output

三、二叉樹遍歷進(jìn)階

Leetcode105. 從前序與中序遍歷序列構(gòu)造二叉樹

思路:

  1. 采用遞歸方法
  2. 終止條件:子節(jié)點的左右節(jié)點為空倚聚,即preorder 或 inorder的長度為0
  3. 利用preorder找根節(jié)點
  4. 找到根節(jié)點之后线衫,在inorder中對根節(jié)點定位,從而分離出左右子樹
  5. 不斷遞歸惑折,最后遍歷出二叉樹
    代碼:
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.right = None
        self.left = None

class Solution:
    def buildTree(self, preorder, inorder):
        if len(preorder) == None:
            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

Leetcode106. 從中序與后序遍歷序列構(gòu)造二叉樹

思路:

  1. 與105類似授账,只不過把preorder換成postorder, 利用postorder 來找根節(jié)點, 即index[-1]是二叉樹的根節(jié)點
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.right = None
        self.left = None

class Solution:
    def buildTree(self, inorder, postorder):
        if len(inorder) == 0:
            return None

        root = TreeNode(postorder[-1]) #構(gòu)造根節(jié)點
        mid = inorder.index(postorder[-1])

        root.left = self.buildTree(inorder[:mid], postorder[:mid])
        root.right = self.buildTree(inorder[mid+1:], postorder[mid:-1])

        return root
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惨驶,一起剝皮案震驚了整個濱河市白热,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粗卜,老刑警劉巖屋确,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異续扔,居然都是意外死亡攻臀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門纱昧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刨啸,“玉大人,你說我怎么就攤上這事识脆∩枇” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵灼捂,是天一觀的道長离例。 經(jīng)常有香客問我,道長纵东,這世上最難降的妖魔是什么粘招? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮偎球,結(jié)果婚禮上洒扎,老公的妹妹穿的比我還像新娘。我一直安慰自己衰絮,他們只是感情好袍冷,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猫牡,像睡著了一般胡诗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天煌恢,我揣著相機(jī)與錄音骇陈,去河邊找鬼。 笑死瑰抵,一個胖子當(dāng)著我的面吹牛你雌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播二汛,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼婿崭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肴颊?” 一聲冷哼從身側(cè)響起氓栈,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婿着,沒想到半個月后授瘦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡祟身,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年奥务,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袜硫。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡氯葬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婉陷,到底是詐尸還是另有隱情帚称,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布秽澳,位于F島的核電站闯睹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏担神。R本人自食惡果不足惜楼吃,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妄讯。 院中可真熱鬧孩锡,春花似錦、人聲如沸亥贸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炕置。三九已至荣挨,卻和暖如春男韧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背默垄。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工此虑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厕倍。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓寡壮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讹弯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

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