本文实例讲述了Python数据结构与算法之二叉树结构定义与遍历方法。分享给大家供大家参考,具体如下:
先序遍历,中序遍历,后序遍历 ,区别在于三条核心语句的位置
层序遍历 采用队列的遍历操作第一次访问根,在访问根的左孩子,接着访问根的有孩子,然后下一层 自左向右一一访问同层的结点
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
|
# 先序遍历 # 访问结点,遍历左子树,如果左子树为空,则遍历右子树, # 如果右子树为空,则向上走到一个可以向右走的结点,继续该过程 preorder(t): if t: print t.value preorder t.L preorder t.R # 中序遍历 # 从根开始,一直走向左下方,直到无结点可以走则停下,访问该节点 # 然后走向右下方到结点,继续走向左下方:如果结点无右孩子,则向上走回父亲结点 inorder(t): inorder(t.L) print t.value inorder(t.R) # 后序遍历 inorder(t): inorder(t.L) inorder(t.R) print t.value # 二叉树结点类型 class BTNode: def __init__( self ,value,lft = None ,rgt = None ): self .value = value self .lft = lft # 结点左分支 BTNode self .rgt = rgt # 结点右分支 BTNode |
为了方便起见,定义一些打印操作
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
|
class BinTree(): def __init__( self ): self .root = None # 创建一个空的二叉树 def isEmpty( self ): # 判断二叉树是否为空 if self .root is None : return True else : return False def makeBT( self ,bt,L = None ,R = None ): # 从当前结点创建二叉树 bt.lft = L bt.rgt = R def returnBTdict( self ): # 返回二叉树的字典模式 if self .isEmpty(): return None def rec(bt = None ,R = True ): if R = = True : bt = self .root return { 'root' :{ 'value' :bt.value, "L" :rec(bt.lft, False ), "R" :rec(bt.rgt, False )} } else : if bt = = None : return None else : return { "value" :bt.value, "L" :rec(bt.lft, False ) if bt.lft ! = None else None , "R" :rec(bt.rgt, False ) if bt.rgt ! = None else None } return None return rec() def __repr__( self ): # 将二叉树结构打印为字典结构 return str ( self .returnBTdict()) |
下面是各种遍历方法,添加到树的类中
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
|
def printT_VLR( self ,bt = None ,rec_count = 0 ): # 输出二叉树结构(先序遍历) # rec_count 用于计算递归深度 以便输出最后的换行符 """ # 先序遍历 # 访问结点,遍历左子树,如果左子树为空,则遍历右子树, # 如果右子树为空,则向上走到一个可以向右走的结点,继续该过程 preorder(t): if t: print t.value preorder t.L preorder t.R """ if bt = = None : bt = self .root print bt.value, btL, btR = bt.lft, bt.rgt if btL ! = None : print btL.value,; rec_count + = 1 ; self .printT_VLR(btL,rec_count); rec_count - = 1 if btR ! = None : print btR.value,; rec_count + = 1 ; self .printT_VLR(btR,rec_count); rec_count - = 1 if rec_count = = 0 : print "\n" def printT_LVR( self ,bt = None ): """ # 中序遍历 # 从根开始,一直走向左下方,直到无结点可以走则停下,访问该节点 # 然后走向右下方到结点,继续走向左下方:如果结点无右孩子,则向上走回父亲结点 inorder(t): inorder(t.L) print t.value inorder(t.R) """ if bt = = None : bt = self .root btL, btR = bt.lft, bt.rgt if btL ! = None : self .printT_LVR(btL) print bt.value, if btR ! = None : self .printT_LVR(btR) def printT_LRV( self ,bt = None ): """ # 后序遍历 inorder(t): inorder(t.L) inorder(t.R) print t.value """ if bt = = None : bt = self .root btL, btR = bt.lft, bt.rgt if btL ! = None : self .printT_LRV(btL) if btR ! = None : self .printT_LRV(btR) print bt.value, def printT_levelorder( self ): """ 层序遍历 采用队列的遍历操作 第一次访问根,在访问根的左孩子,接着访问根的有孩子,然后下一层 自左向右一一访问同层的结点 """ btdict = self .returnBTdict() q = [] q.append(btdict[ 'root' ]) while q: tn = q.pop( 0 ) # 从队列中弹出一个结点(也是一个字典) print tn[ "value" ], if tn[ "L" ]! = None : q.append(tn[ "L" ]) if tn[ "R" ]! = None : q.append(tn[ "R" ]) |
测试打印效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def test(): bt = BinTree() # btns = [BTNode(v) for v in "+*E*D/CAB"] # 层序输入 # bt.root = btns[0] # bt.makeBT(btns[0], L=btns[1], R=btns[2]) # bt.makeBT(btns[1], L=btns[3], R=btns[4]) # bt.makeBT(btns[3], L=btns[5], R=btns[6]) # bt.makeBT(btns[5], L=btns[7], R=btns[8]) btns = [BTNode(v) for v in [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ]] bt.root = btns[ 0 ] bt.makeBT(btns[ 0 ], L = btns[ 1 ], R = btns[ 2 ]) bt.makeBT(btns[ 1 ], L = btns[ 3 ], R = btns[ 4 ]) bt.makeBT(btns[ 2 ], L = btns[ 5 ], R = btns[ 6 ]) bt.makeBT(btns[ 3 ], L = btns[ 7 ], R = btns[ 8 ]) bt.makeBT(btns[ 4 ], L = btns[ 9 ], R = btns[ 10 ]) bt.makeBT(btns[ 5 ], L = btns[ 11 ], R = btns[ 12 ]) bt.makeBT(btns[ 6 ], L = btns[ 13 ], R = btns[ 14 ]) |
输出:
复制代码 代码如下:
{'root': {'R': {'R': {'R': {'R': None, 'L': None, 'value': 15}, 'L': {'R': None, 'L': None, 'value': 14}, 'value': 7}, 'L': {'R': {'R': None, 'L': None, 'value': 13}, 'L': {'R': None, 'L': None, 'value': 12}, 'value': 6}, 'value': 3}, 'L': {'R': {'R': {'R': None, 'L': None, 'value': 11}, 'L': {'R': None, 'L': None, 'value': 10}, 'value': 5}, 'L': {'R': {'R': None, 'L': None, 'value': 9}, 'L': {'R': None, 'L': None, 'value': 8}, 'value': 4}, 'value': 2}, 'value': 1}}
希望本文所述对大家Python程序设计有所帮助。
原文链接:http://www.cnblogs.com/hanahimi/p/4693220.html