@@ -14,17 +14,16 @@ def __init__(self, is_leaf, keys, childs=None, parent=None):
14
14
self .keys = list (sorted (keys ))
15
15
self .is_leaf = is_leaf
16
16
self .__size = len (self .keys )
17
- if childs is None :
18
- self .childs = [None for x in xrange (0 , self .__size )]
19
- self .childs .append (None )
17
+ if not self .is_leaf and childs is None :
18
+ self .childs = [None for x in xrange (0 , self .__size + 1 )]
20
19
else :
21
20
self .childs = childs
22
21
self .parent = parent
23
22
24
23
def __str__ (self ):
25
24
return "" .join (['Node(keys=' , "," .join (map (lambda key : str (key ), self .keys )),
26
- ',leaf ' if self .is_leaf else ',not leaf ' ,
27
- ',childs num=' , str (len (self .childs )), ')\n ' ])
25
+ ',Leaf ' if self .is_leaf else ',Not Leaf ' ,
26
+ ',childs num=' , '0' if self . is_leaf else str (len (self .childs )), ')\n ' ])
28
27
29
28
def __len__ (self ):
30
29
return self .__size
@@ -35,13 +34,16 @@ def append(self, key):
35
34
"""
36
35
result = self .__size
37
36
self .__size += 1
37
+
38
38
for x in xrange (0 , result ):
39
39
if self .keys [x ] > key :
40
40
self .keys .insert (x , key )
41
- self .childs .insert (x , None )
41
+ if not self .is_leaf :
42
+ self .childs .insert (x , None )
42
43
return x
43
44
self .keys .append (key )
44
- self .childs .append (None )
45
+ if not self .is_leaf :
46
+ self .childs .append (None )
45
47
return result
46
48
47
49
def search_child (self , instance ):
@@ -63,23 +65,26 @@ def __init__(self, load_factor=4, *vargs):
63
65
"""Constructor for BTree"""
64
66
self .__root = None
65
67
self .__load_factor = load_factor
66
- self .__size = len ( vargs )
68
+ self .__size = 0
67
69
map (self .insert , vargs )
68
70
69
71
def insert (self , key ):
70
72
"""
71
- 节点插入的时候不需要再检测节点是不是满了,因为load_factor>=2,每次插入节点前调整都是使得节点关键字个数为load_factor-1。
72
- 而插入一个关键字之后节点关键字个数是2*load_factor-1或者load_factor
73
+ 插入一个节点
73
74
:param key:
74
75
:return:
75
76
"""
76
77
if self .__root is None :
77
78
self .__root = Node (True , [key ])
78
79
return
80
+
79
81
cur_node = self .__root
80
82
while not cur_node .is_leaf :
81
83
self .__split (cur_node )
84
+ # 这个地方cur_node并没有被改变,所以是可以继续搜索的。
82
85
cur_node = cur_node .search_child (key )
86
+ print (key )
87
+
83
88
left_node , right_node = self .__split (cur_node )
84
89
if left_node is None or right_node is None :
85
90
# 返回None表示叶节点没有满
@@ -90,27 +95,41 @@ def insert(self, key):
90
95
right_node .append (key )
91
96
else :
92
97
left_node .append (key )
98
+ self .__size += 1
93
99
94
100
def __split (self , node ):
101
+ """
102
+ 在节点满的时候分裂节点。要注意两个问题:
103
+ 1,根节点分裂的时候需要重新设置根节点
104
+ 2,叶节点是没有子节点的,一次要时刻判断
105
+ :param node:
106
+ :return:
107
+ """
95
108
if self .full (node ):
96
109
parent_node = node .parent
97
110
middle_key = node .keys [self .__load_factor - 1 ]
98
111
if parent_node is None :
99
112
# 处理根节点
100
- self .__root = Node (False , [])
101
- parent_node = self . __root
113
+ parent_node = self .__root = Node (False , [])
114
+
102
115
parent_middle_index = parent_node .append (middle_key )
103
- left_node = Node (node .is_leaf , node .keys [:self .__load_factor - 1 ], node .childs [:self .__load_factor ],
116
+ left_node = Node (node .is_leaf , node .keys [:self .__load_factor - 1 ],
117
+ None if node .is_leaf else node .childs [:self .__load_factor ],
104
118
parent_node )
105
- # 注意设定分裂节点的子节点的父指针
106
- for child in left_node .childs :
107
- if child is not None :
108
- child .parent = left_node
109
- right_node = Node (node .is_leaf , node .keys [self .__load_factor :], node .childs [self .__load_factor :],
119
+
120
+ right_node = Node (node .is_leaf , node .keys [self .__load_factor :],
121
+ None if node .is_leaf else node .childs [self .__load_factor :],
110
122
parent_node )
111
- for child in right_node .childs :
112
- if child is not None :
113
- child .parent = right_node
123
+
124
+ # 注意设定分裂节点的子节点的父指针,因为如果node是叶节点,那么两个子节点肯定都是叶节点,反之同理
125
+ if not node .is_leaf :
126
+ for child in left_node .childs :
127
+ if child is not None :
128
+ child .parent = left_node
129
+ for child in right_node .childs :
130
+ if child is not None :
131
+ child .parent = right_node
132
+
114
133
parent_node .childs [parent_middle_index ] = left_node
115
134
parent_node .childs [parent_middle_index + 1 ] = right_node
116
135
self .__root .is_leaf = False
@@ -125,6 +144,12 @@ def full(self, node):
125
144
126
145
@classmethod
127
146
def __search (cls , root , instance ):
147
+ """
148
+ 搜索树中节点
149
+ :param root:
150
+ :param instance:
151
+ :return:
152
+ """
128
153
cur_node = root
129
154
while True :
130
155
cur_len = len (cur_node )
@@ -139,12 +164,20 @@ def __search(cls, root, instance):
139
164
cur_node = cur_node .childs [x ]
140
165
141
166
def min (self ):
167
+ """
168
+ 取出树中最小值
169
+ :return:
170
+ """
142
171
cur_node = self .__root
143
172
while not cur_node .is_leaf :
144
173
cur_node = cur_node .childs [0 ]
145
174
return cur_node .keys [0 ]
146
175
147
176
def max (self ):
177
+ """
178
+ 取出树中最大值
179
+ :return:
180
+ """
148
181
cur_node = self .__root
149
182
while not cur_node .is_leaf :
150
183
cur_node = cur_node .childs [- 1 ]
@@ -182,19 +215,19 @@ def midorder(self, f):
182
215
def __str__ (self ):
183
216
return "\n " .join (self .midorder (lambda s : str (s )))
184
217
185
- def test (self ):
186
- print "-" * 20
187
- print self .__root
188
- print self .__root .childs [0 ]
189
- print self .__root .childs [1 ]
218
+ def processor (self , key ):
219
+ pass
190
220
191
221
192
222
def main ():
193
- btree = BTree (3 , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'R' , 'S' , 'T' , 'U' ,
194
- 'V' , 'X' , 'Y' , 'Z' )
195
- print btree
223
+ import random
224
+ test = ['A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'R' , 'S' , 'T' , 'U' ,
225
+ 'V' , 'X' , 'Y' , 'Z' ]
226
+ random .shuffle (test )
227
+ btree = BTree (3 , * test )
196
228
print btree .max ()
197
229
print btree .min ()
230
+ btree .test ()
198
231
199
232
200
233
if __name__ == "__main__" :
0 commit comments