二叉树的前序、中序、后序非递归遍历 python实现
生活随笔
收集整理的這篇文章主要介紹了
二叉树的前序、中序、后序非递归遍历 python实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
python中二叉樹的定義:
class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = None
如何使用python建立一個二叉樹
前序
class Solution:def preorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""ret = []stack = [root]while stack:node = stack.pop()if node:ret.append(node.val)stack.append(node.right)stack.append(node.left)return ret
通過使用棧先保存要訪問的結點,這里有一點需要注意的是,我們每次先將node的右結點加入到了stack中,然后再加入的是左結點,這樣我們就可以保證在每次stack彈棧的時候,左結點始終先彈出來了。
中序
class Solution:def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res, stack = [], []while True:while root:stack.append(root)root = root.leftif not stack:return resnode = stack.pop()res.append(node.val)root = node.right
通過stack每次都保存左子樹的所有結點,當左子樹已經全部加入了,這時候要訪問左子樹的葉子結點,然后需要轉向,加入當前結點的右結點,然后再繼續上述的過程。
后序
class Solution:def postorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""nodes = []# to_visit是存儲結點的棧to_visit = []cur = rootlast_node = None# 如果當前結點或者要遍歷的結點不為空就持續遍歷while cur or len(to_visit) != 0:# 一直訪問左子樹,直至為空if cur:to_visit.append(cur)cur = cur.leftelse:# 取到棧中最頂部的結點,然后判斷是否有右結點并且右結點是否已經訪問過top_node = to_visit[-1]if top_node.right and last_node != top_node.right:cur = top_node.rightelse:# 訪問結點,并且將last_node記錄為當前訪問的結點nodes.append(top_node.val)last_node = top_nodeto_visit.pop()return nodes
總結
以上是生活随笔為你收集整理的二叉树的前序、中序、后序非递归遍历 python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django学习之路(一)--初识dja
- 下一篇: 分析两小段c++代码 关于unsign