Python實現二叉樹的遞迴和非遞迴遍歷

2021-07-23 05:00:04 字數 2394 閱讀 9026

class

binnode

():def

__init__

( self, val ):

self.lchild = none

self.rchild = none

self.val = val

先序遍歷

遞迴寫法

def

preorder

(self, root):

if root == none:

return

print root.val

self.preorder(root.lchild)

self.preorder(root.rchild)

非遞迴寫法

preorder每次都將遇到的節點壓入棧,當左子樹遍歷完畢後才從棧中彈出最後乙個訪問的節點,訪問其右子樹。在同一層中,不可能同時有兩個節點壓入棧,因此棧的大小空間為o(h),h為二叉樹高度。時間方面,每個節點都被壓入棧一次,彈出棧一次,訪問一次,複雜度為o(n)。

def

preorder

(self, root):

if root == none:

return

mystack =

node = root

while node or mystack:

while node:

# 從根節點開始,一直找它的左子樹

print node.val

node = node.lchild

# while結束表示當前節點node為空,即前乙個節點沒有左子樹了

node = mystack.pop()

# 開始檢視它的右子樹

node = node.rchild

中序遍歷

遞迴寫法

def

inorder

(self, root):

if root == none:

return

self.inorder(root.lchild)

print root.val

self.inorder(root.rchild)

非遞迴寫法

根據上面的先序遍歷,可以類似的構造出中序遍歷。仔細想一下,只有第一種方法改過來時最方便的。需要的改動僅僅調換一下節點訪問的次序,先序是先訪問,再入棧;而中序則是先入棧,彈棧後再訪問。**如下。時間複雜度與空間複雜度同先序一致。

def

inorder

(self, root):

if root == none:

return

mystack =

node = root

while node or mystack:

while node:

# 從根節點開始,一直找它的左子樹

node = node.lchild

# while結束表示當前節點node為空,即前乙個節點沒有左子樹了

node = mystack.pop()

print node.val

# 開始檢視它的右子樹

node = node.rchild

後序遍歷

遞迴寫法

def

postorder

(self, root):

if root == none:

return

self.postorder(root.lchild)

self.postorder(root.rchild)

print root.va

非遞迴寫法

從直覺上來說,後序遍歷對比中序遍歷難度要增大很多。因為中序遍歷節點序列有一點的連續性,而後續遍歷則感覺有一定的跳躍性。先左,再右,最後才中間節點;訪問左子樹後,需要跳轉到右子樹,右子樹訪問完畢了再回溯至根節點並訪問之,**如下:

def

later_stack

(self, root):

if root == none:

return

mystack1 =

mystack2 =

node = root

while mystack1:

# 這個while迴圈的功能是找出後序遍歷的逆序,存在mystack2裡面

node = mystack1.pop()

if node.lchild:

if node.rchild:

while mystack2:

# 將mystack2中的元素出棧,即為後序遍歷次序

print mystack2.pop().val

遞迴實現二叉樹

二叉樹是一種非線性結構,用途廣泛。二叉樹的每個結點的度都不大於2,所以一般用二叉鍊錶來實現二叉樹。二叉樹可以分為根結點,左子樹和右子樹,左子樹 右子樹依然這麼劃分,所以用遞迴實現二叉樹的邏輯是比較簡單的,只需不斷對子樹進行劃分即可。include include include using name...

python實現遞迴二叉樹排序

二叉樹排序是比較有意思的一種排序方法,而且也便於操作。二叉樹的排序過程主要是二叉樹的建立和遍歷的過程。例如有一組資料 3,5,7,20,43,2,15,30 則二叉樹的建立過程如下 下面用例子作為真實效果模擬 實驗效果 實驗 coding utf 8 class btree def init sel...

python實現二叉樹的生成和遞迴遍歷

今日主題 溫故而知新。關於樹的生成和遍歷是好早之前就學習了的知識,最近複習資料結構,重新學習了一遍,發現就是這個簡單的知識點幫助我深入理解了遞迴和物件,或者是我之前基礎太菜了哈哈 好吧,我們來一起複習,一起進步吧 二叉樹的生成用的是層次法,實現時,是用乙個list來儲存節點值,然後按照層次法把這些點...