@@ -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__" :