二叉树遍历的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()


 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值