Skip to content

Commit fffa892

Browse files
committed
26数据结构day04完成
1 parent 33f042b commit fffa892

File tree

5 files changed

+164
-5
lines changed

5 files changed

+164
-5
lines changed

26数据结构/day03/06_merge_sort.py

+24-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,30 @@
11

2-
def merge_sort(alist, first, last):
2+
def merge_sort(alist):
33

44
"""
55
归并排序:对数组进行对半拆分,直到每个只有一个元素,然后进行合并
66
合并中
77
"""
8+
n = len(alist)
9+
if n <= 1:
10+
return alist
11+
12+
mid = n // 2
13+
left_li = merge_sort(alist[:mid])
14+
right_li = merge_sort(alist[mid:])
15+
16+
left_pointer, right_pointer = 0, 0
17+
result = []
18+
19+
while left_pointer < len(left_li) and right_pointer < len(right_li):
20+
21+
if left_li[left_pointer] < right_li[right_pointer]:
22+
result.append(left_li[left_pointer])
23+
left_pointer += 1
24+
else:
25+
result.append(right_li[right_pointer])
26+
right_pointer += 1
27+
28+
result += left_li[left_pointer:]
29+
result += right_li[right_pointer:]
30+
return result
+40-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,43 @@
1-
def binary_search(alist):
1+
def binary_search(alist, item):
22
"""二分法查找,递归方法"""
33

44
n = len(alist)
5-
mid = n // 2
5+
mid = n // 2
6+
7+
if n > 0:
8+
9+
if alist[mid] == item:
10+
return True
11+
elif item < alist[mid]:
12+
# 产生新的列表进行递归
13+
return binary_search(alist[:mid], item)
14+
else:
15+
return binary_search(alist[mid:], item)
16+
17+
return False
18+
19+
20+
"""
21+
二分法查找的折半查找,操作的对象必须有序,其次计算mid需要index需要顺序表才行
22+
时间复杂度为 折半2的几次方等于n,最坏所以为 O(logn),最好就是O(1)
23+
"""
24+
25+
26+
def binary_search_2(alist, item):
27+
"""二分法查找,非递归方法"""
28+
29+
n = len(alist)
30+
first = 0
31+
last = n - 1
32+
33+
while first <= last:
34+
35+
mid = (first + last) // 2
36+
37+
if item == alist[mid]:
38+
return True
39+
elif item < alist[mid]:
40+
last = mid - 1
41+
else:
42+
first = mid + 1
43+
return False

26数据结构/day04/02_tree.py

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
"""
2+
树分为好多种,二叉树就是一个父节点最多只能包含两个子节点,树的度最多为2
3+
4+
完全二叉树:如果有n层,那么除了最底层之外的节点都挂满了子节点,父节点都达到了最大的度
5+
满二叉树:所有节点都达到最大的度,包含最底层
6+
平衡二叉树:当且仅当任意一个节点的**两颗子树**的高度差不大于1的二叉树
7+
有序二叉树:树的每一个节点都是有序的,根节点左边的节点都比根节点小,右边的都比根节点大
8+
"""
9+
10+
"""
11+
树的存储:
12+
如果采用顺序存储的话,那么以数组的方式,装完一层之后去装下一层的节点,虽然遍历上有优势,但是占用空间大,非主流的存储方式
13+
一般采用的就是链式的存储方式,树常用在xml,html的解析中,mysql的索引,路由协议,文件系统的目录结构
14+
"""
15+
16+
17+
class Node(object):
18+
"""树的结构类似于链表的扩充,也需要节点"""
19+
20+
def __init__(self, elem=None, lchild=None, rchild=None):
21+
self.elem = elem
22+
self.lchild = lchild
23+
self.rchild = rchild
24+
25+
26+
class Tree(object):
27+
28+
def __init__(self, root):
29+
self.root = root
30+
31+
def add(self, item):
32+
"""完全二叉树的添加,那一层缺元素的话那么就直接添加到该层的节点,那一层的节点没满就添加到此处"""
33+
node = Node(item)
34+
if self.root is None:
35+
self.root = node
36+
return
37+
38+
queue = [self.root]
39+
while queue:
40+
# 只要队列存在元素,就pop判断
41+
cur_node = queue.pop(0)
42+
if cur_node.lchild is None:
43+
cur_node.lchild = node
44+
return
45+
else:
46+
queue.append(cur_node.lchild)
47+
48+
if cur_node.rchild is None:
49+
cur_node.rchild = node
50+
return
51+
else:
52+
queue.append(cur_node.rchild)
53+
54+
def breadth_travel(self):
55+
"""广度遍历"""
56+
if self.root is None:
57+
return
58+
59+
queue = [self.root]
60+
while queue:
61+
62+
cur_node = queue.pop(0)
63+
print(cur_node)
64+
65+
if cur_node.lchild is not None:
66+
queue.append(cur_node.lchild)
67+
if cur_node.rchild is not None:
68+
queue.append(cur_node.rchild)
69+
70+
def pre_order(self, node):
71+
"""深度遍历中的先序便利,根节点先, 根 -> 左 -> 右"""
72+
73+
if node is None:
74+
return
75+
76+
print(node.elem)
77+
self.pre_order(node.lchild)
78+
self.pre_order(node.rchild)
79+
80+
def in_order(self, node):
81+
"""深度遍历中的中序便利,根节点在中, 左 -> 根 -> 右"""
82+
83+
if node is None:
84+
return
85+
86+
self.in_order(node.lchild)
87+
print(node.elem)
88+
self.in_order(node.rchild)
89+
90+
def post_order(self, node):
91+
"""深度遍历中的后序便利,根节点在后, 左 -> 右 -> 后"""
92+
93+
if node is None:
94+
return
95+
96+
self.post_order(node.lchild)
97+
self.post_order(node.rchild)
98+
print(node.elem)

26数据结构/day04/__init__.py

Whitespace-only changes.

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
|Author|白发老书生|
1010
|---|---
1111
|E-mail|Github联系
12-
> 最近更新至第23章节(共30章节):2019-05-08
12+
> 最近更新至第26章节(共30章节):2019-07-01
1313
1414
****
1515

@@ -56,7 +56,7 @@
5656
- [x] [23电商爬虫和Scrapy框架](/23电商爬虫和Scrapy框架/README.md)
5757
- [x] [24自动化运维](/24自动化运维/README.md)
5858
- [x] [25项目环境自动化部署](/25项目环境自动化部署/README.md)
59-
- [ ] [26数据结构](/26数据结构/README.md)
59+
- [x] [26数据结构](/26数据结构/README.md)
6060
- [ ] [27数据挖掘](/27数据挖掘/README.md)
6161

6262

0 commit comments

Comments
 (0)