二叉樹的遍歷是指按照某種順序依次訪問樹中的所有節點一次。
四種遍歷方式分別是:先序遍歷、中序遍歷、後序遍歷、層序遍歷。其中前三種屬於深度優先遍歷(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 ...