實現二叉樹的三種遍歷方式,未完善二叉樹的生成、樹的程序遍歷等,本程序僅做記錄,程序中構造的二叉樹結構如下:
# -*- 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()