python 树结构遍历_Python实现二叉树结构与进行二叉树遍历的方法详解

二叉树的建立

使用类的形式定义二叉树,可读性更好class BinaryTree:

def __init__(self, root):

self.key = root

self.left_child = None

self.right_child = None

def insert_left(self, new_node):

if self.left_child == None:

self.left_child = BinaryTree(new_node)

else:

t = BinaryTree(new_node)

t.left_child = self.left_child

self.left_child = t

def insert_right(self, new_node):

if self.right_child == None:

self.right_child = BinaryTree(new_node)

else:

t = BinaryTree(new_node)

t.right_child = self.right_child

self.right_child = t

def get_right_child(self):

return self.right_child

def get_left_child(self):

return self.left_child

def set_root_val(self, obj):

self.key = obj

def get_root_val(self):

return self.key

r = BinaryTree('a')

print(r.get_root_val())

print(r.get_left_child())

r.insert_left('b')

print(r.get_left_child())

print(r.get_left_child().get_root_val())

r.insert_right('c')

print(r.get_right_child())

print(r.get_right_child().get_root_val())

r.get_right_child().set_root_val('hello')

print(r.get_right_child().get_root_val())

Python进行二叉树遍历

需求:

python代码实现二叉树的:

1. 前序遍历,打印出遍历结果

2. 中序遍历,打印出遍历结果

3. 后序遍历,打印出遍历结果

4. 按树的level遍历,打印出遍历结果

5. 结点的下一层如果没有子节点,以‘N'代替

方法:

使用defaultdict或者namedtuple表示二叉树

使用StringIO方法,遍历时写入结果,最后打印出结果

打印结点值时,如果为空,StringIO()写入‘N '

采用递归访问子节点

代码#!/usr/bin/env python3

# -*- coding: utf-8 -*-

# test tree as below:

''' 1 / \ / \ / \ / \ 2 3 / \ / \ / \ / \ 4 5 6 N / \ / \ / \ 7 N N N 8 9 / \ / \ / \ N N N N N N '''

from collections import namedtuple

from io import StringIO

#define the node structure

Node = namedtuple('Node', ['data', 'left', 'right'])

#initialize the tree

tree = Node(1,

Node(2,

Node(4,

Node(7, None, None),

None),

Node(5, None, None)),

Node(3,

Node(6,

Node(8, None, None),

Node(9, None, None)),

None))

#read and write str in memory

output = StringIO()

#read the node and write the node's value

#if node is None, substitute with 'N '

def visitor(node):

if node is not None:

output.write('%i ' % node.data)

else:

output.write('N ')

#traversal the tree with different order

def traversal(node, order):

if node is None:

visitor(node)

else:

op = {

'N': lambda: visitor(node),

'L': lambda: traversal(node.left, order),

'R': lambda: traversal(node.right, order),

}

for x in order:

op[x]()

#traversal the tree level by level

def traversal_level_by_level(node):

if node is not None:

current_level = [node]

while current_level:

next_level = list()

for n in current_level:

if type(n) is str:

output.write('N ')

else:

output.write('%i ' % n.data)

if n.left is not None:

next_level.append(n.left)

else:

next_level.append('N')

if n.right is not None:

next_level.append(n.right)

else:

next_level.append('N ')

output.write('\n')

current_level = next_level

if __name__ == '__main__':

for order in ['NLR', 'LNR', 'LRN']:

if order == 'NLR':

output.write('this is preorder traversal:')

traversal(tree, order)

output.write('\n')

elif order == 'LNR':

output.write('this is inorder traversal:')

traversal(tree, order)

output.write('\n')

else:

output.write('this is postorder traversal:')

traversal(tree, order)

output.write('\n')

output.write('traversal level by level as below:'+'\n')

traversal_level_by_level(tree)

print(output.getvalue())

更多Python实现二叉树结构与进行二叉树遍历的方法详解相关文章请关注PHP中文网!

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值