二叉樹遍歷的python實現(前序、中序、後序)
阿新 • • 發佈:2018-12-15
實現二叉樹的三種遍歷方式,未完善二叉樹的生成、樹的程式遍歷等,本程式僅做記錄,程式中構造的二叉樹結構如下:
# -*- coding: utf-8 -*- """ Created on Thu Sep 13 16:46:46 2018 Description:二叉樹 Version: @author: HJY """ class Node: def __init__(self,item=None,left=None,right=None): self.item = item self.lchild = left self.rchild = right def __str__(self): return self.item #中序遍歷 def print_mtree(self): if self.lchild: op = self.lchild op.print_mtree() print(self) if self.rchild: cp = self.rchild cp.print_mtree() #前序遍歷 def print_ftree(self): print(self) if self.lchild: op = self.lchild op.print_ftree() if self.rchild: cp = self.rchild cp.print_ftree() #後序遍歷 def print_etree(self): if self.lchild: op = self.lchild op.print_etree() if self.rchild: cp = self.rchild cp.print_etree() print(self) A = Node(item='A',left = Node(item = 'B',left=Node(item='D'),right=Node(item='E')), right = Node(item = 'C',left=Node(item='F'))) A.print_mtree() print('-'*10) A.print_ftree() print('-'*10) A.print_etree()
補充——對於列表元素按完全二叉樹進行構造的方式建立二叉樹的函式
傳入引數(列表,當前元素的索引值)
明確每一個元素在二叉樹中的位置是很重要的,我們由此才可以推知在建立節點時,它的左孩子是哪個索引值指示的元素....
由完全二叉樹的節點序號可知父節點的序號為i,則其左孩子節點序號為2i ,右孩子節點序號為2i + 1,如我們上面的二叉樹圖
(頁面頂端),A的序號為1,B的序號為2,C的序號為3...。但list中的索引值是從0開始的,也就是說在實際list中,A的索引為
0,B的索引為1,C的索引為2,如果仍沿用上面的式子就不正確了,因此我們修改成:2(i+1)- 1和 2(i+1)
其次,每一節點的建立應該是一個遞迴操作,比如呼叫我們定義的節點類建立A節點時,需要建立它的左孩子B節點,建立右孩子C節點;而對於B節點的建立又需要建立它的左孩子D節點,右孩子E節點....
基於上面兩點共識,我們得出我們建立完全二叉樹的草稿:
#注:省略Node類的定義,Node類的定義參照前面的程式碼 def create_tree(op_list,i): return Node(op_list[i], left = create_tree(op_list,(i+1)*2-1), right = create_tree(op_list,(i+1)*2) ) if __name__ == '__main__': #二叉樹構建測試 string = 'abcdefg' string_list = list(string) root = create_tree(string_list,0)
實際上,這個建立函式是會導致索引越界的異常的,缺少了終止條件,比如在上例中到‘G’元素就已經結束,可實際上在生成D節
點時,卻為它繼續呼叫函式,企圖生成D節點的左右孩子節點,E的左右孩子節點.....因此我們增加一個終止條件,一旦呼叫函式
的當前索引 i 越界,函式即返回None,因此最終版:
def create_tree(op_list,i):
if i > len(op_list)-1:
return
return Node(op_list[i],
left = create_tree(op_list,(i+1)*2-1),
right = create_tree(op_list,(i+1)*2)
)
#二叉樹構建測試
string = 'abcdefg'
string_list = list(string)
root = create_tree(string_list,0)
print('後序遍歷')
root.print_etree()
print('先序遍歷')
root.print_ftree()
print('中序遍歷')
root.print_mtree()