Skip to content

Commit c84099b

Browse files
committed
Add binary search tree and modify README
1 parent 3d3d91f commit c84099b

File tree

5 files changed

+185
-33
lines changed

5 files changed

+185
-33
lines changed

Diff for: README.md

+30-31
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,43 @@
11
这是什么?
2-
==========
2+
=========
33

4-
这是一个专供一小撮人学习算法的仓储这里记录着每个人的算法成长历程
4+
这是一个专供一小撮人学习算法的仓储, 这里记录着每个人的算法成长历程.
55

66
为什么需要?
7-
==========
7+
===========
88

9-
我想很多程序员都有一本翻了没几页的《算法导论》坚持下来的原因只有一个没坚持下来的原因却又千千万个
9+
我想, 很多程序员都有一本翻了没几页的《算法导论》, 坚持下来的原因只有一个, 没坚持下来的原因却又千千万个.
1010

11-
* 工作忙没时间
12-
* 太难了看不懂
13-
* 暂时用不到以后再说
14-
* ...
11+
* 工作忙, 没时间.
12+
* 太难了, 看不懂.
13+
* 暂时用不到, 以后再说.
14+
* ....
1515

16-
就这样很多人不超过100页就放弃了包括我:sob:
16+
就这样, 很多人不超过100页就放弃了(包括我:sob:)
1717

18-
有句老话说得好:“一个人走的快:runner:,一群人走得远:two_men_holding_hands:。”
19-
20-
那么!让我们一起来学算法吧,一起相互监督克服懒惰!
18+
有句老话说得好: "一个人走的快:runner:, 一群人走得远:two_men_holding_hands:."
2119

20+
那么! 让我们一起来学算法吧, 一起相互监督克服懒惰!
2221

2322
Rules!
24-
==========
23+
======
2524

26-
既然大家都是拖延症患者那么一定要有一套强有力的措施来治这病
25+
既然大家都是拖延症患者, 那么一定要有一套强有力的措施来治这病.
2726

28-
一条`不留情面,强而有力`的规矩
27+
一条`不留情面,强而有力`的规矩:
2928

30-
#### 按时间完成每次任务并且提交如果有两次未完成踢出学习小组毫不留情!!! ####
29+
#### 按时间完成每次任务并且提交! 如果有两次未完成, 踢出学习小组! 毫不留情!!! ####
3130

32-
如果你想要有所学习和进步,那么,坚持下来吧
31+
如果你想要有所学习和进步, 那么, 坚持下来吧!
3332

3433
How?
35-
==========
34+
====
3635

37-
作业提交方法
36+
作业提交方法:
3837

39-
首先 `fork` 这个项目每次任务我会放到章节对应目录下的`markdown`请大家及时查看同时我会在微信群进行通知和teambition进行通知
38+
首先 `fork` 这个项目, 每次任务我会放到章节对应目录下的`markdown`, 请大家及时查看, 同时我会在微信群进行通知和teambition进行通知.
4039

41-
作业目录一般如下
40+
作业目录一般如下:
4241

4342
1-树
4443
1-二叉树
@@ -48,27 +47,27 @@ How?
4847
1-...
4948
2-...
5049

51-
每个人在每一次任务下创建自己id命名的文件夹请保持每次id一致),然后在里面完成任务,如:
52-
50+
每个人在每一次任务下创建自己id命名的文件夹(请保持每次id一致), 然后在里面完成任务, 如:
51+
5352
1-树
5453
1-二叉树
54+
Akagi201
5555
daimajia
56-
kehr
5756
...
5857
...
5958
2-AVL树
6059
...
61-
62-
书写完成后,发送`pull request`,检查通过后,即可。
6360

64-
== 坚持就是胜利! ==
61+
书写完成后, 发送`pull request`, 检查通过后, 即可.
62+
63+
== 坚持就是胜利! ==
6564

66-
光荣榜
65+
光荣榜:
6766
=======
6867

69-
只要你按时完成一期任务你就会上光荣榜领取一枚小星星 :star:
68+
只要你按时完成一期任务, 你就会上光荣榜, 领取一枚小星星 :star:
7069

71-
耻辱柱:
70+
羞耻柱:
7271
=======
7372

74-
这里记录的是被踢出学习小组的家伙们 :gun:
73+
这里记录的是被踢出学习小组的家伙们: :gun:

Diff for: tree/binary-search/README.md

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# 第一期-第二题 「二叉搜索树(BST)」#
2+
3+
### 概念
4+
5+
二叉搜索树(Binary search tree), 也叫有序二叉树(Ordered binary tree), 排序二叉树(Sorted binary tree). 是指一个空树或者具有下列性质的二叉树:
6+
7+
1. 若任意结点的左子树不为空, 则左子树上所有的结点的键值小于它的根结点的键值.
8+
2. 若任意结点的右子树不为空, 则右子树上所有结点的值均大于它的根结点的值.
9+
3. 任意结点的左右子树也为二叉搜索树.
10+
4. 没有键值相等的节点.
11+
12+
![举例](http://hxraid.iteye.com/upload/picture/pic/56207/2e1d1d2e-30df-3d3f-b6dd-06af9d1e373b.gif)
13+
14+
### 性能分析
15+
16+
查找代价:
17+
18+
* 树中每个结点左右子树高度大致相同时, 树高为logN, 则平均查找长度与logN成正比, 查找的平均时间复杂度在O(logN)数量级上.
19+
* 当先后插入的关键字有序时, BST退化成单支树结构, 此时树高N, 平均查找长度为(N + 1) / 2, 平均复杂度在O(N)数量级上.
20+
21+
插入代价:
22+
23+
* 新结点插入到树的叶子上, 完全不需要改变树中的原有的结点组织结构, 插入一个节点的代价与查找一个不存在的数据的代价完全相同.
24+
25+
26+
总结:
27+
28+
* 最好时间复杂度O(logN).
29+
* 最坏时间复杂度O(N).
30+
* 插入删除操作算法简单, 时间复杂度与查找差不多.
31+
32+
### 最坏时间过长改进方案(后续会跟进学习):
33+
34+
1. SBT
35+
2. AVL
36+
3. Red-Black
37+
38+
### 应用:
39+
40+
* Linux寄存器cache查询([regcache_lookup_reg](https://github.com/mirrors/linux-2.6/blob/10d0c9705e80bbd3d587c5fad24599aabaca6688/drivers/base/regmap/regcache.c#L570))就用了二叉查找树的结构.
41+
* C++ STL, C#, Java set和map的搜索方法就是使用的BST.
42+
43+
------------
44+
45+
## 任务:
46+
47+
实现一个二叉查找树,要求实现以下方法:
48+
49+
```
50+
typedef int T;
51+
struct stnode{
52+
T data;
53+
struct stnode *left;
54+
struct stnode *right;
55+
};
56+
```
57+
58+
* make_tree 创建二叉搜索树
59+
* insert 插入一个新的值到已存在的二叉搜索树中
60+
* find 通过值查找一个节点
61+
* erase 通过值删除一个节点
62+
* in_order 中序遍历该树
63+
64+
PS: 参数请自行传入, 函数名可改变为自己习惯的风格, 但是: 请保持函数顺序
65+
66+
任务截止日期为: 2014-2-23 夜里11点30
67+
68+
提交方法:
69+
70+
* 首先请`fork`这个项目到自己的仓储中.
71+
* `git clone`自己的仓储到本地.
72+
* 请在该目录下创建`自己id`的文件夹, 如`Akagi201`.
73+
* 在自己文件夹下书写代码, 完成后`git push`到自己仓储并发起`pull request`.
74+
75+
如果对`git``github`不熟悉的同学, 可以在此学习: <http://www.worldhello.net/gotgithub/>, 也可以在微信群或者teambition上发起讨论.

Diff for: tree/binary-search/binary-search-tree.c

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
2+
/*
3+
* @file binary-search-tree.c
4+
*
5+
* @author Akagi201
6+
* @date 2014/02/17
7+
*
8+
* binary search tree C file
9+
*
10+
*/
11+
12+
#include "binary-search-tree.h"
13+
#include <stdlib.h>
14+
#include <stdio.h>
15+
16+
/*
17+
* @brief input pre-order -> make binary tree
18+
*
19+
* pre-order, space
20+
*
21+
* @param[in] tree: binary tree root node
22+
* @param[out] null
23+
* @return null
24+
* @sa
25+
* @note
26+
* @warning
27+
*/
28+
void make_tree(struct stnode **tree){
29+
30+
return;
31+
}
32+
33+
int main(void){
34+
35+
return 0;
36+
}

Diff for: tree/binary-search/binary-search-tree.h

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
2+
/*
3+
* @file binary-search-tree.h
4+
*
5+
* @author Akagi201
6+
* @date 2014/02/17
7+
*
8+
* binary search tree header file
9+
*
10+
*/
11+
12+
#ifndef BINARY_SEARCH_TREE_H_
13+
#define BINARY_SEARCH_TREE_H_
14+
15+
/*
16+
* @struct stnode
17+
*
18+
* @brief definition of binary search tree
19+
*
20+
* using pointer
21+
*
22+
* @author Akagi201
23+
* @date 2014/02/17
24+
*/
25+
typedef int T;
26+
struct stnode{
27+
T data;
28+
struct stnode *left;
29+
struct stnode *right;
30+
};
31+
32+
void make_tree(struct stnode **tree);
33+
34+
void insert(T const element);
35+
36+
void find(T const element);
37+
38+
void erase(T const element);
39+
40+
void in_order(struct stnode *tree);
41+
42+
#endif

Diff for: tree/binary/binary-tree.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
#define BINARY_TREE_H_
1414

1515
/*
16-
* @struct btnode
16+
* @struct btnode
1717
*
18-
* brief definition of binary tree
18+
* @brief definition of binary tree
1919
*
2020
* using pointer
2121
*

0 commit comments

Comments
 (0)