Skip to content

Commit 4a50b45

Browse files
committed
树和二叉树;fix readme
1 parent eae3319 commit 4a50b45

File tree

11 files changed

+70
-5
lines changed

11 files changed

+70
-5
lines changed

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
- 使用场景,什么时候用
4040

4141
## 目录结构
42-
这里讲解的章节我参考了下边教材中列举的一些书籍,并且自己设计了大纲,争取做到循序渐进。因为实现一些高级数据结构的时候会用到
42+
这里讲解的章节我参考了下边教材中列举的一些书籍,并且自己设计了大纲,争取做到循序渐进,简单实用。因为实现一些高级数据结构的时候会用到
4343
很多底层数据结构,防止跳跃太大导致读者理解困难。
4444

4545
课程的目录结构如下,每一章都有配套的文字讲义(markdown),示例代码,视频讲解,详细的讲解一般会放在视频里,使用手写板来
@@ -93,7 +93,7 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
9393
[《Data Structures and Algorithms in Python》]( https://book.douban.com/subject/10607365/): 适合对 Python
9494
和算法比较熟悉的同学,或者是有其他语言编程经验的同学。英文版,缺点是书中错误真的很多,代码有些无法运行
9595

96-
[《算法导论》]( https://book.douban.com/subject/20432061/): 喜欢数学证明和板砖书的同学可以参考,有很多高级主题。使用伪代码
96+
[《算法导论》第三版]( https://book.douban.com/subject/20432061/): 喜欢数学证明和板砖书的同学可以参考,有很多高级主题。使用伪代码
9797

9898

9999
## 讲课形式
@@ -186,6 +186,8 @@ pip install https://github.com/mitya57/python-markdown-math/archive/master.zip
186186

187187
# 或者直接
188188
pip install -r requirements.txt
189+
190+
# 如果你 fork 了本项目,可以定期拉取主仓库的代码来获取更新,目前还在不断更新相关章节
189191
```
190192

191193
编写并查看:

docs/05_栈/stack.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
本章我们讲讲 后进先出的栈。
66

77
生活中的数据结构:
8+
89
- 栈。好比在桶里头放盘子,先放的盘子放在了底下,后来的盘子放在上边。你要拿的时候,也是先拿最上边的。
910

1011
栈其实也很简单,因为基础操作就俩,一个 push 和一个 pop,咦,咋和队列一样的?

docs/13_高级排序算法/advanced_sorting.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77

88
在讲完二叉树之后,我们会看下它的应用:
99

10-
- [堆和堆排序](./heap_sort.md)
10+
- 堆和堆排序

docs/13_高级排序算法/quick_sort.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def test_quicksort():
3232
random.shuffle(seq)
3333
assert quicksort(seq) == sorted(seq)
3434
```
35-
是不是很简单,下次面试官让你手写快排你再写不出来就有点过分啦。 当然这个实现有两个不好的地方:
35+
是不是很简单,下次面试官让你手写快排你再写不出来就有点不太合适啦。 当然这个实现有两个不好的地方:
3636

3737
- 第一是它需要额外的存储空间,我们想实现 inplace 原地排序。
3838
- 第二是它的 partion 操作每次都要两次遍历整个数组,我们想改善一下。
@@ -47,7 +47,7 @@ def quicksort_inplace(array, beg, end): # 注意这里我们都用左闭右
4747
quicksort_inplace(array, pivot+1, end)
4848
```
4949

50-
能否实现只遍历一次数组就可以完成 partition 操作呢?实际上是可以的。我们设置首位俩个指针 left, right,两个指针不断向中间收拢。如果遇到 left 位置的元素大于 pivot 并且 right 指向的元素小于 pivot,我们就交换这俩元素,当 left > right 的时候推出就行了,这样实现了一次遍历就完成了 partition。如果你感觉懵逼,纸上画画就立马明白了。我们来撸代码实现:
50+
能否实现只遍历一次数组就可以完成 partition 操作呢?实际上是可以的。我们设置首位俩个指针 left, right,两个指针不断向中间收拢。如果遇到 left 位置的元素大于 pivot 并且 right 指向的元素小于 pivot,我们就交换这俩元素,当 left > right 的时候退出就行了,这样实现了一次遍历就完成了 partition。如果你感觉懵逼,纸上画画就立马明白了。我们来撸代码实现:
5151

5252
```py
5353
def partition(array, beg, end):
77.6 KB
Loading
57.1 KB
Loading
69.5 KB
Loading

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# 树和二叉树
2+
前面我们讲了两种使用分治和递归解决排序问题的归并排序和快速排序,堆排序先就此打住,因为涉及到树的概念,所以我们先来讲讲树。
3+
讲完了树之后后面我们开始介绍一种有用的数据结构堆(heap), 以及借助堆来实现的堆排序,相比前两种排序算法要稍难理解和实现一些。
4+
5+
#
6+
这里先简单讲讲树的概念。树结构是一种包括节点(nodes)和边(edges)的拥有层级关系的一种结构, 它的形式和家谱树非常类似:
7+
8+
![](./family_tree.png)
9+
10+
如果你了解 linux 文件结构(tree 命令),它的结构也是一棵树。我们快速看下树涉及到的一些概念:
11+
12+
![](./tree.png)
13+
14+
- 根节点(root): 树的最上层的节点,任何非空的树都有一个节点
15+
- 路径(path): 从起始节点到终止节点经历过的边
16+
- 父亲(parent):除了根节点,每个节点的上一层又边连接的节点就是它的父亲(节点)
17+
- 孩子(children): 每个节点由边指向的下一层节点
18+
- 兄弟(siblings): 同一个父亲并且处在同一层的节点
19+
- 子树(subtree): 每个节点包含它所有的后代组成的子树
20+
21+
22+
# 二叉树
23+
24+
了解完树的结构以后,我们来看树结构里一种简单但是却比较常用的树-二叉树。
25+
二叉树是一种简单的树,它的每个节点最多只能包含两个孩子,以下都是一些合法的二叉树:
26+
27+
![](./binary_tree.png)
28+
![](./binary_tree_level.png)
29+
30+
31+
# 树的表示
32+
33+
34+
# 思考题
35+
36+
# 延伸阅读
37+
- 《算法导论》第 6 章 Heapsort
38+
- 《Data Structures and Algorithms in Python》 13 章

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

57.2 KB
Loading
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# 堆(heap)
2+
前面我们讲了两种使用分治和递归解决排序问题的归并排序和快速排序,本章我们开始介绍一种有用的数据结构堆(heap), 以及借助堆来实现的堆排序,相比前两种排序算法要稍难理解和实现一些。
3+
4+
# 二叉树
5+
这里先简单讲讲树的概念,因为这里会用到它,但是我们不会详细介绍,后边的章节我们还会碰到它。树结构是一种包括节点(nodes)和边(edges)的拥有层级关系的一种结构, 它的形式和家谱树非常类似:
6+
7+
![](./family_tree.png)
8+
9+
如果你了解 linux 文件结构(tree 命令),它的结构也是一棵树。
10+
二叉树是一种简单的树,它的每个节点最多只能包含两个孩子,以下都是一些合法的二叉树:
11+
12+
![](./binary_tree.png)
13+
14+
# 什么是堆?
15+
堆是一种用数组实现的类似二叉树的数据结构,这么说可能有点懵,没讲过二叉树也先别着急,这里不会用到太多它的概念,后边我们会讲到。看一个图你就明白了:
16+
17+
18+
# 思考题
19+
20+
# 延伸阅读
21+
- 《算法导论》第 6 章 Heapsort
22+
- 《Data Structures and Algorithms in Python》 13 章

mkdocs.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,5 @@ pages:
2626
- 高级排序算法: '13_高级排序算法/advanced_sorting.md'
2727
- 分治法与归并排序: '13_高级排序算法/merge_sort.md'
2828
- 快速排序: '13_高级排序算法/quick_sort.md'
29+
- 树与二叉树: '14_树与二叉树/tree.md'
30+
- 堆和堆排序: '15_堆与堆排序/heap_and_heapsort.md'

0 commit comments

Comments
 (0)