Skip to content

Commit 21c122a

Browse files
committed
fix tree
1 parent 485a786 commit 21c122a

File tree

3 files changed

+12
-28
lines changed

3 files changed

+12
-28
lines changed

docs/17_二叉查找树/binary_search_tree.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# 二叉查找树(BST)
22

3-
二叉树的一种应用就是来实现堆,今天我们再看看用二叉查找树。
4-
前面有章节说到了查找操作,包括线性查找和二分查找,线性查找效率比较低,二分又要求必须是有序的序列,
5-
为了维持有序插入的代价比较高。能不能有一种插入和查找都比较快的数据结构呢?二叉查找树就是这样一种结构,可以高效地插入和查询节点。
3+
二叉树的一种应用就是来实现堆,今天我们再看看用二叉查找树(Binary Search Tree, BST)
4+
前面有章节说到了查找操作,包括线性查找、二分查找、哈希查找等,线性查找效率比较低,二分又要求必须是有序的序列,
5+
为了维持有序插入的代价比较高、哈希查找效率很高但是浪费空间。能不能有一种插入和查找都比较快的数据结构呢?二叉查找树就是这样一种结构,可以高效地插入和查询节点。
66

77
# BST 定义
88

@@ -183,7 +183,7 @@ bst = BST.build_from(NODE_LIST)
183183

184184
12 在中序遍历中的逻辑前任和后继分别是 4 和 23 节点。于是我们还有一种方法来删除 12 这个节点:
185185

186-
- 找到节点待删除节点 N(12) 的后继节点 S(23)
186+
- 找到待删除节点 N(12) 的后继节点 S(23)
187187
- 复制节点 S 到节点 N
188188
- 删除节点 S
189189

@@ -207,14 +207,14 @@ bst = BST.build_from(NODE_LIST)
207207
subtree.right = self._bst_remove(subtree.right, key)
208208
return subtree
209209
else: # 找到了需要删除的节点
210-
if subtree.left is None and subtree.right is None: # left node
210+
if subtree.left is None and subtree.right is None: # 叶节点,返回 None 把其父亲指向它的指针置为 None
211211
return None
212212
elif subtree.left is None or subtree.right is None: # 只有一个孩子
213213
if subtree.left is not None:
214-
return subtree.left
214+
return subtree.left # 返回它的孩子并让它的父亲指过去
215215
else:
216216
return subtree.right
217-
else: # 俩孩子
217+
else: # 俩孩子,寻找后继节点替换
218218
successor_node = self._bst_min_node(subtree.right)
219219
subtree.key, subtree.value = successor_node.key, subtree.value
220220
subtree.right = self._bst_remove(subtree.right, successor_node.key)

docs/17_二叉查找树/bst.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,14 @@ def _bst_remove(self, subtree, key):
9797
subtree.right = self._bst_remove(subtree.right, key)
9898
return subtree
9999
else: # 找到了需要删除的节点
100-
if subtree.left is None and subtree.right is None: # left node
100+
if subtree.left is None and subtree.right is None: # 叶节点,返回 None 把其父亲指向它的指针置为 None
101101
return None
102102
elif subtree.left is None or subtree.right is None: # 只有一个孩子
103103
if subtree.left is not None:
104-
return subtree.left
104+
return subtree.left # 返回它的孩子并让它的父亲指过去
105105
else:
106106
return subtree.right
107-
else: # 俩孩子
107+
else: # 俩孩子,寻找后继节点替换
108108
successor_node = self._bst_min_node(subtree.right)
109109
subtree.key, subtree.value = successor_node.key, subtree.value
110110
subtree.right = self._bst_remove(subtree.right, successor_node.key)

docs/18_图与图的遍历/graph.md

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -128,29 +128,13 @@ def dfs(graph, start):
128128
129129
130130
print('dfs:')
131-
dfs(GRAPH, 'A')
131+
dfs(GRAPH, 'A') # A B C I D G F E H
132132
133-
"""
134-
DFS_SEARCHED = set()
135-
136-
137-
def dfs(graph, start):
138-
if start not in DFS_SEARCHED:
139-
print(start)
140-
DFS_SEARCHED.add(start)
141-
for node in graph[start]:
142-
if node not in DFS_SEARCHED:
143-
dfs(graph, node) # 递归访问邻居节点
144-
145-
146-
print('dfs:')
147-
dfs(GRAPH, 'A')
148-
"""
149133
```
150134

151135

152136
# 思考题
153-
- DFS 中我们使用到了递归,请你用栈来改写这个函数?
137+
- DFS 中我们使用到了递归,请你用栈来改写这个函数?(代码里有答案,我建议你先尝试自己实现)
154138

155139
# 延伸阅读
156140
图的算法还有很多,这里就不一一列举了,感兴趣的读者可以继续阅读一下材料。

0 commit comments

Comments
 (0)