MCPcopy Create free account
hub / github.com/QMHTMY/RustBook / insert

Method insert

publication/code/chapter08/avl.rs:215–272  ·  view source on GitHub ↗

插入节点

(&mut self, key: T)

Source from the content-addressed store, hash-verified

213
214 // 插入节点
215 fn insert(&mut self, key: T) -> (bool, bool) {
216 let ret = match self {
217 // 没有节点,直接插入
218 Null => {
219 let node = AvlNode {
220 key: key,
221 left: Null,
222 right: Null,
223 bfactor: 0,
224 };
225 *self = Tree(Box::new(node));
226 (true, true)
227 },
228 // 比较节点值,再判断该从哪边插入
229 Tree(ref mut node) => match node.key.cmp(&key) {
230 Equal => (false, false), // 相等,无需插入
231 Less => {
232 // 比节点数据大,插入右边
233 let (inserted, deepened) = node.right.insert(key);
234
235 // inserted 表示是否插入
236 // deepened 表示是否加深
237 if deepened {
238 let ret = match node.bfactor {
239 -1 => (inserted, false),
240 0 => (inserted, true),
241 1 => (inserted, false),
242 _ => unreachable!(),
243 };
244 node.bfactor += 1;
245 ret
246 } else {
247 (inserted, deepened)
248 }
249 },
250 Greater => {
251 // 比节点数据小,插入左边
252 let (inserted, deepened) = node.left.insert(key);
253
254 if deepened {
255 let ret = match node.bfactor {
256 -1 => (inserted, false),
257 0 => (inserted, true),
258 1 => (inserted, false),
259 _ => unreachable!(),
260 };
261 node.bfactor -= 1;
262 ret
263 } else {
264 (inserted, deepened)
265 }
266 },
267 },
268 };
269 self.rebalance();
270
271 ret
272 }

Callers 3

enqueueMethod · 0.45
basicFunction · 0.45
orderFunction · 0.45

Calls 2

cmpMethod · 0.45
rebalanceMethod · 0.45

Tested by

no test coverage detected