日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python非递归实现二叉树的后续遍历

發(fā)布時間:2023/12/2 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python非递归实现二叉树的后续遍历 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

leetcode 145. Binary Tree Postorder Traversal

思路一:

  • 使用一個棧stack保存經過的根結點,另一個棧flag保存每個結點的右子樹是否遍歷;
  • 如果根結點存在,結點入棧,并把結點的右子樹遍歷結果置為0,代表沒遍歷;
  • 把root指向左子樹;
  • 如果棧不為空,判斷棧頂元素右子樹是否存在以及是否已經遍歷,如果存在并且沒有遍歷,則把root指向右子樹;否則,結點出棧,并且把結點的右子樹遍歷標志出棧;
  • 重復2-4直到棧空或者root不存在。

    這是第一個一下想到的思路,可以看到用了兩個棧作為額外的空間,復雜度不是很好,并且在leetcode上提交后,運行時間感覺也不甚理想,有沒有更好的方法呢?
  • # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = Noneclass Solution(object):def postorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""ret = []stack = []flag = []while root or stack:while root:stack.append(root)flag.append(0)root = root.leftif stack:top = stack[-1]if top.right and not flag[-1]:flag[-1] = 1root = top.rightelse:flag.pop()ret.append(stack.pop().val)return ret

    感覺在學校時接觸的第一門語言是C,數(shù)據(jù)結構也是基于C學的,導致第一印象總是往上面靠,寫出來的代碼不是很Pythonic,下面是一個我覺得更好的,代碼更少,也更容易理解的方法。

    思路二:

    后續(xù)遍歷根結點,先遍歷左子樹,然后遍歷右子樹,此時反過來考慮:先遍歷根結點,然后遍歷右子樹,最后是左子樹,這樣就可以轉化為和先序遍歷一個類型了,最后只把遍歷結果逆序輸出就ok了,而先序遍歷是之前寫過并且比較好理解的。

  • 使用棧存儲結點;
  • 當結點存在或者棧不為空,判斷結點;
  • 當結點存在,結點值保存,結點入棧,并將指針指向結點的右子樹;
  • 當棧不為空,結點出棧,并將指針指向左子樹;
  • 重復2-4直到結果產生;
  • 逆序輸出結果,利用Python列表的-1.
  • # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = Noneclass Solution(object):def postorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""ret = []stack = []while root or stack:while root:ret.append(root.val)stack.append(root)root = root.rightif stack:top = stack.pop()root = top.leftreturn ret[::-1]

    轉載于:https://www.cnblogs.com/qiaojushuang/p/7887517.html

    總結

    以上是生活随笔為你收集整理的Python非递归实现二叉树的后续遍历的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。