实现二叉树的三种遍历方式,未完善二叉树的生成、树的程序遍历等,本程序仅做记录,程序中构造的二叉树结构如下:
# -*- 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()