Skip to content

Commit 72474cf

Browse files
author
tianqing.liang
committed
二分搜索树
1 parent dc5b236 commit 72474cf

File tree

4 files changed

+113
-2
lines changed

4 files changed

+113
-2
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
7. **[Dart,Python]归并排序**
1212
8. **[Dart,Python]快速排序**
1313
9. **[Dart,Python]二分搜索**
14-
10. 二分搜索树
14+
10. **[Dart,Python]二分搜索树**
1515
11. 集合 和 映射
1616
12.
1717
13. 优先队列

python/BST.py

+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
class BSTNode(object):
2+
def __init__(self, key, value, left=None, right=None):
3+
self.key, self.value, self.left, self.right = key, value, left, right
4+
5+
6+
class BST(object):
7+
def __init__(self, root=None):
8+
self.root = root
9+
10+
@classmethod
11+
def build_from(cls, node_list):
12+
cls.size = 0
13+
key_to_node_dict = {}
14+
for node_dict in node_list:
15+
key = node_dict['key']
16+
key_to_node_dict[key] = BSTNode(key, value=key)
17+
18+
for node_dict in node_list:
19+
key = node_dict['key']
20+
node = key_to_node_dict[key]
21+
if node_dict['is_root']:
22+
root = node
23+
node.left = key_to_node_dict.get(node_dict['left'])
24+
node.right = key_to_node_dict.get(node_dict['right'])
25+
cls.size += 1
26+
return cls(root)
27+
28+
def _bst_search(self, subtree, key):
29+
if subtree is None:
30+
return None
31+
elif key < subtree.key:
32+
return self._bst_search(subtree.left, key)
33+
elif key > subtree.key:
34+
return self._bst_search(subtree.right, key)
35+
else:
36+
return subtree
37+
38+
def __contains__(self, key):
39+
return self._bst_search(self.root, key) is not None
40+
41+
def get(self, key, default=None):
42+
node = self._bst_search(self.root, key)
43+
if node is None:
44+
return default
45+
else:
46+
return node.value
47+
48+
def _bst_min_node(self, subtree):
49+
if subtree is None:
50+
return None
51+
elif subtree.left is None:
52+
return subtree
53+
else:
54+
return self._bst_min_node(subtree.left)
55+
56+
def bst_min(self):
57+
node = self._bst_min_node(self.root)
58+
return node.value if node else None
59+
60+
def _bst_insert(self, subtree, key, value):
61+
62+
if subtree is None:
63+
subtree = BSTNode(key, value)
64+
elif key < subtree.key:
65+
subtree.left = self._bst_insert(subtree.left, key, value)
66+
elif key > subtree.key:
67+
subtree.right = self._bst_insert(subtree.right, key, value)
68+
return subtree
69+
70+
def add(self, key, value):
71+
node = self._bst_search(self.root, key)
72+
if node is not None:
73+
node.value = value
74+
return False
75+
else:
76+
self.root = self._bst_insert(self.root, key, value)
77+
self.size += 1
78+
return True
79+
80+
def _bst_remove(self, subtree, key):
81+
if subtree is None:
82+
return None
83+
elif key < subtree.key:
84+
subtree.left = self._bst_remove(subtree.left, key)
85+
return subtree
86+
elif key > subtree.key:
87+
subtree.right = self._bst_remove(subtree.right, key)
88+
return subtree
89+
else: # 找到了需要删除的节点
90+
if subtree.left is None and subtree.right is None: # 叶节点,返回 None 把其父亲指向它的指针置为 None
91+
return None
92+
elif subtree.left is None or subtree.right is None: # 只有一个孩子
93+
if subtree.left is not None:
94+
return subtree.left # 返回它的孩子并让它的父亲指过去
95+
else:
96+
return subtree.right
97+
else: # 俩孩子,寻找后继节点替换,并删除其右子树的后继节点,同时更新其右子树
98+
successor_node = self._bst_min_node(subtree.right)
99+
subtree.key, subtree.value = successor_node.key, successor_node.value
100+
subtree.right = self._bst_remove(subtree.right, successor_node.key)
101+
return subtree
102+
103+
def remove(self, key):
104+
assert key in self
105+
self.size -= 1
106+
return self._bst_remove(self.root, key)

python/linkedlist.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ def __init__(self,value):
77
def __str__(self):
88
return self.value;
99

10-
10+
'''
11+
链表
12+
'''
1113
class LinkedList(object):
1214

1315
def __init__(self):

python/loopqueue.py

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
'''
2+
循环队列
3+
'''
14
class LoopQueue(object):
25

36
def __init__(self, n=10):

0 commit comments

Comments
 (0)