Skip to content

Commit 22bf7c4

Browse files
committed
add BST and funcitons
1 parent c70ca6d commit 22bf7c4

File tree

1 file changed

+218
-0
lines changed

1 file changed

+218
-0
lines changed

Diff for: DataStructure/Tree/BST.py

+218
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
import copy
2+
3+
from DataStructure.Tree.tree import Tree
4+
5+
6+
# 二叉查找树
7+
class BST(Tree):
8+
root = None
9+
10+
def __init__(self, key, data):
11+
"""
12+
初始化树
13+
:param data: 节点值
14+
"""
15+
self.key = key
16+
self.data = data
17+
self._l_child = None
18+
self._r_child = None
19+
super().__init__(key, [self.l_child, self._r_child])
20+
21+
def __str__(self):
22+
return str({
23+
'key': str(self.key),
24+
'data': str(self.data)
25+
})
26+
27+
@property
28+
def l_child(self):
29+
return self._l_child
30+
31+
@l_child.setter
32+
def l_child(self, l_child):
33+
if not isinstance(l_child, BST): return
34+
self._l_child = l_child
35+
self.children = [self.l_child, self.r_child]
36+
37+
@property
38+
def r_child(self):
39+
return self._r_child
40+
41+
@r_child.setter
42+
def r_child(self, r_child):
43+
if not isinstance(r_child, BST): return
44+
self._r_child = r_child
45+
self.children = [self.l_child, self.r_child]
46+
47+
# 再书中找到一个值
48+
def get(self, key):
49+
"""
50+
51+
:param key: 需要找到的值
52+
:return: 节点
53+
"""
54+
55+
def inner_func(node, _key):
56+
"""
57+
58+
:param node: 节点
59+
:param _key: 值
60+
:return: 找到值时返回节点,未找到时,递归或者返回None
61+
"""
62+
if node is None:
63+
return None
64+
if _key > node.key:
65+
return inner_func(node.r_child, _key)
66+
elif _key < node.key:
67+
return inner_func(node.l_child, _key)
68+
else:
69+
return node
70+
71+
return inner_func(self.root, key)
72+
73+
def put(self, key, value):
74+
"""
75+
如果 key存在就更新 value,如果 key 不存在就插入新节点
76+
如果根节点不存在就创建一个 BST 实例
77+
:param key:
78+
:param value:
79+
:return:
80+
"""
81+
if self.root is None:
82+
return BST(key, value)
83+
84+
def inner_func(node, _key, _value):
85+
if node is None:
86+
return BST(_key, _value)
87+
if _key > node.key:
88+
node.r_child = inner_func(node.r_child, _key, _value)
89+
elif _key < node.key:
90+
node.l_child = inner_func(node.l_child, _key, _value)
91+
else:
92+
node.data = _value
93+
return node
94+
95+
return inner_func(self.root, key, value)
96+
97+
def select(self, num):
98+
"""
99+
选出第num小的元素
100+
:param num:
101+
:return: 节点
102+
"""
103+
104+
def inner_select(node, _num):
105+
if node is None:
106+
return
107+
t = node.l_child.size()
108+
if _num < t:
109+
return inner_select(node.l_child, _num)
110+
elif _num > t:
111+
return inner_select(node.r_child, _num - t - 1)
112+
else:
113+
return node
114+
115+
return inner_select(self.root, num)
116+
117+
def min(self):
118+
def inner_min(node):
119+
if node.l_child is None:
120+
return node
121+
else:
122+
return inner_min(node.l_child)
123+
124+
return inner_min(self)
125+
126+
def rank(self, key):
127+
"""
128+
获得给定键的排名
129+
:param key:
130+
:return:
131+
"""
132+
133+
def inner_rank(node, _key):
134+
if node is None:
135+
return
136+
if _key > node.key:
137+
return inner_rank(node.r_child, _key)
138+
elif _key < node.key:
139+
return 1 + node.l_child.size() + inner_rank(node.l_child, _key)
140+
else:
141+
if node.l_child is None:
142+
return 0
143+
else:
144+
return node.l_child.size()
145+
146+
return inner_rank(self.root, key)
147+
148+
def delete(self, key):
149+
"""
150+
删除指定 key 的键
151+
:param key:
152+
:return:
153+
"""
154+
155+
def delete_min_node(node):
156+
if node.l_child is None:
157+
return node.r_child
158+
node.l_child = delete_min_node(node.l_child)
159+
return node
160+
161+
def inner_delete(node, _key):
162+
if node is None:
163+
return
164+
if _key > node.key:
165+
node.r_child = inner_delete(node.r_child, _key)
166+
elif _key < node.key:
167+
node.l_child = inner_delete(node.l_child, _key)
168+
else:
169+
if node.r_child is None:
170+
return node.l_child
171+
elif node.l_child is None:
172+
return node.r_child
173+
temp = copy.copy(node)
174+
node = min(temp.right)
175+
node.r_child = delete_min_node(temp.r_child)
176+
node.l_child = temp.l_chlid
177+
return node
178+
179+
return delete_min_node(self)
180+
181+
def find_keys(self, low, high):
182+
"""
183+
查找范围内所有的数
184+
:param low:
185+
:param high:
186+
:return:
187+
"""
188+
BST_list = []
189+
190+
def inner_find_keys(node, _low, _high):
191+
if node is None:
192+
return
193+
if _low < node.key:
194+
inner_find_keys(node.l_child, _low, _high)
195+
if _low <= node.key <= _high:
196+
BST_list.append(node)
197+
if _high > node.key:
198+
inner_find_keys(node.r_child, _low, _high)
199+
200+
inner_find_keys(self, low, high)
201+
return BST_list
202+
203+
204+
if __name__ == '__main__':
205+
root = BST(50, "2")
206+
root.put(3, "5")
207+
root.put(5, "5")
208+
root.put(80, "5")
209+
root.put(60, "5")
210+
root.print_tree()
211+
print(root.get(60))
212+
print(root.select(2))
213+
print(root.rank(5))
214+
root.delete(5)
215+
print(root.min())
216+
root.print_tree()
217+
for node in root.find_keys(50, 100):
218+
print(node)

0 commit comments

Comments
 (0)