1. 程式人生 > >二叉樹遍歷的python實現(前序、中序、後序)

二叉樹遍歷的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()