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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

二叉树的前序、中序、后序非递归遍历 python实现

發布時間:2023/11/28 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树的前序、中序、后序非递归遍历 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实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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