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 )
0 commit comments