1、二叉树的三种遍历方式
二叉树有三种遍历方式:先序遍历,中序遍历,后续遍历 即:先中后指的是访问根节点的顺序 eg:先序 根左右 中序 左根右 后序 左右根
遍历总体思路:将树分成最小的子树,然后按照顺序输出
1.1 先序遍历
a 先访问根节点
b 访问左节点
c 访问右节点
a(b ( d ( h ) )( e ( i ) ))( c ( f )( g )) -- abdheicfg
1.2 中序遍历
a 先访问左节点
b 访问根节点
c 访问右节点
( ( ( h ) d ) b ( ( i ) e ) ) a ( ( f ) c ( g ) ) -- hdbieafcg
1.3后序遍历
a 先访问左节点
b 访问右节点
c 访问根节点
((hd)(ie)b)(fgc)a -- hdiebfgca
2、python3实现树结构
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
|
#实现树结构的类,树的节点有三个私有属性 左指针 右指针 自身的值 class Node(): def __init__( self ,data = None ): self ._data = data self ._left = None self ._right = None def set_data( self ,data): self ._data = data def get_data( self ): return self ._data def set_left( self ,node): self ._left = node def get_left( self ): return self ._left def set_right( self ,node): self ._right = node def get_right( self ): return self ._right if __name__ = = '__main__' : #实例化根节点 root_node = Node( 'a' ) # root_node.set_data('a') #实例化左子节点 left_node = Node( 'b' ) #实例化右子节点 right_node = Node( 'c' ) #给根节点的左指针赋值,使其指向左子节点 root_node.set_left(left_node) #给根节点的右指针赋值,使其指向右子节点 root_node.set_right(right_node) print (root_node.get_data(),root_node.get_left().get_data(),root_node.get_right().get_data()) |
3、实现树的递归遍历(前 中 后 层次遍历)
下例是树的遍历算法,其中对树的类进行了优化,
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
|
#实现树结构的类,树的节点有三个私有属性 左指针 右指针 自己的值 class Node(): def __init__( self ,data = None ,left = None ,right = None ): self ._data = data self ._left = left self ._right = right #先序遍历 遍历过程 根左右 def pro_order(tree): if tree = = None : return False print (tree._data) pro_order(tree._left) pro_order(tree._right) #后序遍历 def pos_order(tree): if tree = = None : return False # print(tree.get_data()) pos_order(tree._left) pos_order(tree._right) print (tree._data) #中序遍历 def mid_order(tree): if tree = = None : return False # print(tree.get_data()) mid_order(tree._left) print (tree._data) mid_order(tree._right) #层次遍历 def row_order(tree): # print(tree._data) queue = [] queue.append(tree) while True : if queue = = []: break print (queue[ 0 ]._data) first_tree = queue[ 0 ] if first_tree._left ! = None : queue.append(first_tree._left) if first_tree._right ! = None : queue.append(first_tree._right) queue.remove(first_tree) if __name__ = = '__main__' : tree = Node( 'A' ,Node( 'B' ,Node( 'D' ),Node( 'E' )),Node( 'C' ,Node( 'F' ),Node( 'G' ))) pro_order(tree) mid_order(tree) pos_order(tree) |
4、递归算法
上面两张图片是从知乎贴过来的;图1中返回后会直接返回到上一级的返回,这种想法是不全面的,较合理的返回应该是如图2 在子函数返回时应返回到调用子函数的节点,这样在执行完剩余代码再返回到上一级
如果是按照图1返回的话二叉树的遍历就不能按照上例来实现。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/jiuyang/p/7928248.html