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來儲存節點值,然後按照層次法把這些點...