二叉树的建立
使用类的形式定义二叉树,可读性更好
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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 '
采用递归访问子节点
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
#!/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())
|