Skip to content

Commit 233b1c5

Browse files
committed
递归方法遍历二叉树
1 parent 1646912 commit 233b1c5

File tree

3 files changed

+176
-0
lines changed

3 files changed

+176
-0
lines changed

binary_tree_traversal.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
#问题
2+
3+
用递归方式遍历二叉树
4+
5+
#思路说明
6+
7+
遍历二叉树的方法有广度优先和深度优先两类,下面阐述的是深度优先。
8+
9+
以下图的二叉树为例:
10+
11+
![](./pics/travesaltree1.png)
12+
13+
先定义三个符号标记:
14+
15+
- 访问结点本身(N)
16+
- 遍历该结点的左子树(L)
17+
- 遍历该结点的右子树(R)
18+
19+
有四种方式:
20+
21+
1. 前序遍历(PreorderTraversal,NLR):先访问根结点,然后遍历其左右子树
22+
2. 中序遍历(InorderTraversal,LNR):先访问左子树,然后访问根节点,再访问右子树
23+
3. 后序遍历(PostorderTraversal,LRN):先访问左右子树,再访问根结点
24+
4. 层序遍历(levelorderTraversal):按照从上到下的层顺序访问
25+
26+
上面的数,按照以上四种方式遍历,得到的结果依次是:
27+
28+
1. preorder: 1 2 4 7 5 3 6 8 9
29+
2. inorder: 7 4 2 5 1 8 6 9 3
30+
3. postorder: 7 4 5 2 8 9 6 3 1
31+
4. level-order: 1 2 3 4 5 6 7 8 9
32+
33+
下面用递归的方式,解决此题。
34+
35+
#解决(Python)
36+
37+
#! /usr/bin/env python
38+
#coding:utf-8
39+
40+
from collections import namedtuple
41+
from sys import stdout
42+
43+
Node = namedtuple('Node', 'data, left, right')
44+
tree = Node(1,
45+
Node(2,
46+
Node(4,
47+
Node(7, None, None),
48+
None),
49+
Node(5, None, None)),
50+
Node(3,
51+
Node(6,
52+
Node(8, None, None),
53+
Node(9, None, None)),
54+
None))
55+
56+
57+
#前序(pre-order,NLR)
58+
59+
def preorder(node):
60+
if node is not None:
61+
print node.data,
62+
preorder(node.left)
63+
preorder(node.right)
64+
65+
66+
#中序(in-order,LNR)
67+
68+
def inorder(node):
69+
if node is not None:
70+
inorder(node.left)
71+
print node.data,
72+
inorder(node.right)
73+
74+
75+
#后序(post-order,LRN)
76+
77+
def postorder(node):
78+
if node is not None:
79+
postorder(node.left)
80+
postorder(node.right)
81+
print node.data,
82+
83+
84+
#层序(level-order)
85+
86+
def levelorder(node, more=None):
87+
if node is not None:
88+
if more is None:
89+
more = []
90+
more += [node.left, node.right]
91+
print node.data,
92+
if more:
93+
levelorder(more[0], more[1:])
94+
95+
if __name__=="__main__"
96+
print ' preorder: ',
97+
preorder(tree)
98+
print '\t\n inorder: ',
99+
inorder(tree)
100+
print '\t\n postorder: ',
101+
postorder(tree)
102+
print '\t\nlevelorder: ',
103+
levelorder(tree)
104+
print '\n'

binary_tree_traversal.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#! /usr/bin/env python
2+
#coding:utf-8
3+
4+
"""
5+
#问题
6+
用递归方式遍历二叉树
7+
"""
8+
9+
from collections import namedtuple
10+
from sys import stdout
11+
12+
Node = namedtuple('Node', 'data, left, right')
13+
tree = Node(1,
14+
Node(2,
15+
Node(4,
16+
Node(7, None, None),
17+
None),
18+
Node(5, None, None)),
19+
Node(3,
20+
Node(6,
21+
Node(8, None, None),
22+
Node(9, None, None)),
23+
None))
24+
25+
26+
#前序(pre-order,NLR)
27+
28+
def preorder(node):
29+
if node is not None:
30+
print node.data,
31+
preorder(node.left)
32+
preorder(node.right)
33+
34+
35+
#中序(in-order,LNR)
36+
37+
def inorder(node):
38+
if node is not None:
39+
inorder(node.left)
40+
print node.data,
41+
inorder(node.right)
42+
43+
44+
#后序(post-order,LRN)
45+
46+
def postorder(node):
47+
if node is not None:
48+
postorder(node.left)
49+
postorder(node.right)
50+
print node.data,
51+
52+
53+
#层序(level-order)
54+
55+
def levelorder(node, more=None):
56+
if node is not None:
57+
if more is None:
58+
more = []
59+
more += [node.left, node.right]
60+
print node.data,
61+
if more:
62+
levelorder(more[0], more[1:])
63+
64+
print ' preorder: ',
65+
preorder(tree)
66+
print '\t\n inorder: ',
67+
inorder(tree)
68+
print '\t\n postorder: ',
69+
postorder(tree)
70+
print '\t\nlevelorder: ',
71+
levelorder(tree)
72+
print '\n'

pics/travesaltree1.png

2.75 KB
Loading

0 commit comments

Comments
 (0)