Skip to content

Commit 2da39a3

Browse files
committed
二叉树层序遍历
1 parent 6b83b30 commit 2da39a3

File tree

3 files changed

+82
-3
lines changed

3 files changed

+82
-3
lines changed

Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,3 @@ serve:
77
publish:
88
git push origin master
99
mkdocs gh-deploy
10-

docs/14_树与二叉树/btree.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
# -*- coding: utf-8 -*-
22

3+
from collections import deque
4+
5+
6+
class Queue(object):
7+
def __init__(self):
8+
self._items = deque()
9+
10+
def append(self, value):
11+
return self._items.append(value)
12+
13+
def pop(self):
14+
return self._items.popleft()
15+
16+
def empty(self):
17+
return len(self._items) == 0
18+
319

420
class BinTreeNode(object):
521
def __init__(self, data, left=None, right=None):
@@ -47,6 +63,30 @@ def reverse(self, subtree):
4763
self.reverse(subtree.left)
4864
self.reverse(subtree.right)
4965

66+
def layer_trav(self, subtree):
67+
cur_nodes = [subtree]
68+
next_nodes = []
69+
while cur_nodes or next_nodes:
70+
for node in cur_nodes:
71+
print(node.data)
72+
if node.left:
73+
next_nodes.append(node.left)
74+
if node.right:
75+
next_nodes.append(node.right)
76+
cur_nodes = next_nodes # 继续遍历下一层
77+
next_nodes = []
78+
79+
def layer_trav_use_queue(self, subtree):
80+
q = Queue()
81+
q.append(subtree)
82+
while not q.empty():
83+
cur_node = q.pop()
84+
print(cur_node.data)
85+
if cur_node.left:
86+
q.append(cur_node.left)
87+
if cur_node.right:
88+
q.append(cur_node.right)
89+
5090

5191
node_list = [
5292
{'data': 'A', 'left': 'B', 'right': 'C', 'is_root': True},
@@ -63,7 +103,13 @@ def reverse(self, subtree):
63103

64104

65105
btree = BinTree.build_from(node_list)
106+
print('====先序遍历=====')
66107
btree.preorder_trav(btree.root)
108+
print('====层序遍历=====')
109+
btree.layer_trav(btree.root)
110+
print('====用队列层序遍历=====')
111+
btree.layer_trav_use_queue(btree.root)
112+
67113
btree.reverse(btree.root)
68-
print('====我是华丽丽滴分割线=====')
114+
print('====反转之后的结果=====')
69115
btree.preorder_trav(btree.root)

docs/14_树与二叉树/tree.md

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,40 @@ btree.preorder_trav(btree.root) # 输出 A, B, D, E, H, C, F, G, I, J
197197

198198
# 二叉树层序遍历
199199

200-
除了递归的方式遍历之外,我们还可以使用层序遍历的方式。程序遍历比较直白,就是从根节点开始按照一层一层的方式区遍历节点。
200+
除了递归的方式遍历之外,我们还可以使用层序遍历的方式。层序遍历比较直白,就是从根节点开始按照一层一层的方式遍历节点。
201+
我们可以从根节点开始,之后把所有当前层的孩子都按照从左到右的顺序放到一个列表里,下一次遍历所有这些孩子就可以了。
202+
203+
```py
204+
def layer_trav(self, subtree):
205+
cur_nodes = [subtree]
206+
next_nodes = []
207+
while cur_nodes or next_nodes:
208+
for node in cur_nodes:
209+
print(node.data)
210+
if node.left:
211+
next_nodes.append(node.left)
212+
if node.right:
213+
next_nodes.append(node.right)
214+
cur_nodes = next_nodes # 继续遍历下一层
215+
next_nodes = []
216+
```
217+
218+
还有一种方式就是使用一个队列,之前我们直到队列是一个先进先出结构,如果我们按照一层一层的顺序从左往右把节点放到一个队列里,
219+
也可以实现程序遍历:
220+
221+
```py
222+
def layer_trav_use_queue(self, subtree):
223+
q = Queue()
224+
q.append(subtree)
225+
while not q.empty():
226+
cur_node = q.pop()
227+
print(cur_node.data)
228+
if cur_node.left:
229+
q.append(cur_node.left)
230+
if cur_node.right:
231+
q.append(cur_node.right)
232+
```
233+
201234

202235
# 反转二叉树
203236
之所以单拎出来说这个是因为 mac 下著名的 brew 工具作者据说是因为面试 google 白板编程没写出来反转二叉树跪了。然后人家就去了苹果 😂。其实吧和遍历操作相比也没啥太大区别,递归交换就是了:
@@ -216,6 +249,7 @@ btree.preorder_trav(btree.root) # 输出 A, B, D, E, H, C, F, G, I, J
216249
- 树的遍历我们用了 print,请你尝试换成一个 callback,这样就能自定义处理树节点的方式了。
217250
- 请问树的遍历操作时间复杂度是多少?假设它的 size 是 n
218251
- 你能用非递归的方式来实现树的遍历吗?我们知道计算机内部使用了 stack,如果我们自己模拟如何实现?请你尝试完成
252+
- 使用树的层序遍历我们能实现一个树的左右视图,比如从一个二叉树的左边能看到哪些节点。请你尝试做这个练习题 https://leetcode.com/problems/binary-tree-right-side-view/description/
219253

220254

221255
# 延伸阅读

0 commit comments

Comments
 (0)