二叉樹遍歷的python實現(前序、中序、後序)

實現二叉樹的三種遍歷方式,未完善二叉樹的生成、樹的程序遍歷等,本程序僅做記錄,程序中構造的二叉樹結構如下:

圖片加載失敗

# -*- 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()


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章