python實現樹的遍歷

2021-10-09 02:29:26 字數 4555 閱讀 8749

二叉樹的遍歷是指按照某種順序依次訪問樹中的所有節點一次。

四種遍歷方式分別是:先序遍歷、中序遍歷、後序遍歷、層序遍歷。其中前三種屬於深度優先遍歷(dfs),後一種屬於廣度優先遍歷(bfs)。

首先宣告節點類

class treenode:

def __init__(self, x):

self.val = x

self.left = none

self,right = none

二叉樹的先序遍歷

若二叉樹為空樹,則空操作;否則,(1)訪問根結點;(2)先序遍歷左子樹;(3)先序遍歷右子樹。

遞迴實現:

def preorder(self, root):

if not root:

return

# 先訪問根節點

print(root.val)

# 遞迴訪問左子樹

preorder(root.left)

# 訪問右子樹

preorder(root.right)

迭代實現:

def pre(self, root):

# 將 root放入棧頂

stack = [root]

while stack:

# 取棧頂元素

s = stack.pop()

if s:

print(s.val)

# 由於棧的先進後出特性 先放入右孩子 再放入左孩子

二叉樹的中序遍歷

若二叉樹為空樹,則空操作;否則,(1)中序遍歷左子樹;(2)訪問根結點;(3)中序遍歷右子樹。

遞迴實現:

def midorder(self, root):

if not root:

return

# 先訪問左節點 再訪問根節點 最後訪問右節點

midorder(root.left)

print(roo.val)

midorder(root.right)

迭代實現:

# 對於樹的遍歷 ,基本會用到棧這個資料結構

def inorder(self,root):

stack =

while stack or root:

# 當root節點存在,一直往下遍歷 直到遍歷到葉節點

while root:

root = root.left

# 當前節點為none時 出棧乙個節點列印出節點的value值

root = satck.pop()

print(root.val)

# 也系欸但的孩子肯定為空 所以就會彈出棧中葉節點的父節點,當左子樹完全遍歷完就會遍歷右子樹

root = root.right

二叉樹的後序遍歷

若二叉樹為空樹,則空操作;否則,(1)後序遍歷左子樹;(2)後序遍歷右子樹;(3)訪問根結點。

遞迴實現:

def postorder(self, root):

if not root:

return

postorder(root.left)

postorder(root.right)

print(root.val)

迭代實現:

法一:

def post(self, root):

stack =

while root or stack:

# 下行遍歷 一直遍歷到葉節點

while root:

# 將根節點放入放入棧中

# 能左就左 能右就右

if root.left:

root = root.left

if root.right:

root = root.right

s = stack.pop()

print(s.val)

# 如果當前節點是上一節點的左子節點,則遍歷右子節點

if stack and s == stack[-1].left:

root = stack[-1].right

else:

root = none

法二:在先序遍歷的基礎上稍加改動

# 先序遍歷 順序是 根左右 ,後續遍歷是 左右根  

# 所以可以將res陣列的值反過來輸出

def post_2(self, root):

stack = [root]

res =

while stack:

s = stack.pop()

return res[::-1]

二叉樹的層次遍歷

從上往下、從左至右依次列印樹的節點

寫法一:利用佇列

def levelorder(self, root):

# 如果根節點不存在,返回空列表

if not root:

return

# 結果列表

res =

# 將根節點放入佇列

queue = [root]

while queue:

# 獲取當前佇列的長度 也就是這一層的節點數

size = len(queue)

tmp =

# 將佇列中的元素拿出來 放到臨時list中

# 如果左右子樹不為空,放入佇列中

for _ in range(size):

# 彈出佇列中的節點

r = queue.pop(0)

# 將r的值 存進臨時列表中

if r.left:

if r.right:

return res

寫法二:利用collections.deque 雙向佇列 

def levelorder(self, root):

""":type root: treenode

:rtype: list[list[int]]

"""# 建立佇列

queue = collections.deque()

# 結果集

res =

while queue:

size = len(queue)

level =

for _ in range(size):

# 彈出左邊第乙個元素

cur = queue.popleft()

if not cur:

continue

if level:

return res

二叉樹的一些基本操作總結:

1.二叉樹的最大深度

def maxdepth(self, root):

if not root:

return 0

return max(maxdepth(root.left), maxdepth(root.right)) + 1

2.二叉樹的最小深度

最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。可以通過遞迴求左右節點的最小深度的較小值,也可以層序遍歷找到第乙個葉子節點所在的層數。

遞迴實現:

def mindepth(self, root):

if not root:

return 0

if not root.left and not root.right:

return 1

if not root.right:

return 1+self.mindepth(root.left)

if not root.left:

return 1+self.mindepth(root.right)

return 1+min(self.mindepth(root.left),self.mindepth(root.right))

迭代實現:

def min_depth(self, root):

if not root:

return 0

ans , count = [root], 1

# 遍歷完所有節點

while ans:

n = len(ans)

# 遍歷完某一層的節點

for _ in range(n):

r = ans.pop(0)

if r:

# 演算法遍歷每一層 發現某一層的某個節點沒有子樹 返回count

if not r.left and not r.right:

return count

# 如果左孩子存在 加入棧

count+=1

return count

未完待續 ,後續還會補充更多知識點。

學習筆記 Python實現樹的遍歷 (DFS)

學習了通過python實現樹的遍歷 dfs 自己還原了一下 樹 dfs class treenode object def init self,x self.val x self.left none self.right none if name main 構建樹 t1 treenode 1 t2 ...

python實現二叉樹的遍歷

先序 1.訪問根結點 2.訪問左子樹 3.訪問右子樹 中序 1.訪問左子樹 2.訪問根結點 3.訪問右子樹 後序 1.訪問左子樹 2.訪問右子樹 3.訪問根結點 節點類 def init self,elem 1,lchild none,rchild none self.elem elem self....

二叉樹的遍歷 python實現)

目錄 二 前序遍歷 三 中序遍歷 四 後序遍歷 輸入根節點,使用佇列來遍歷。先進的節點會先出去,出去時將自己的子節點放到佇列中。def level root if not root return none queue root res while queue node queue.pop 0 if ...