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

Method insert

code/chapter07/avl.rs:29–81  ·  view source on GitHub ↗
(&mut self, val: T)

Source from the content-addressed store, hash-verified

27 }
28
29 fn insert(&mut self, val: T) -> (bool, bool) {
30 let ret = match *self {
31 Null => { // 没有节点,直接插入
32 let node = AvlNode {
33 val: val,
34 left: Null,
35 right: Null,
36 bfactor: 0,
37 };
38 *self = Tree(Box::new(node));
39 (true, true)
40 },
41 Tree(ref mut node) => match node.val.cmp(&val) {
42 // 比较节点值,再判断该从哪边插入
43 // inserted 表示是否插入
44 // deepened 表示是否加深
45 Equal => (false, false), // 相等,无需插入
46 Less => { // 比节点数据大,插入右边
47 let (inserted, deepened) = node.right.insert(val);
48 if deepened {
49 let ret = match node.bfactor {
50 -1 => (inserted, false),
51 0 => (inserted, true),
52 1 => (inserted, false),
53 _ => unreachable!(),
54 };
55 node.bfactor += 1;
56 ret
57 } else {
58 (inserted, deepened)
59 }
60 },
61 Greater => { // 比节点数据小,插入左边
62 let (inserted, deepened) = node.left.insert(val);
63 if deepened {
64 let ret = match node.bfactor {
65 -1 => (inserted, false),
66 0 => (inserted, true),
67 1 => (inserted, false),
68 _ => unreachable!(),
69 };
70 node.bfactor -= 1;
71 ret
72 } else {
73 (inserted, deepened)
74 }
75 },
76 },
77 };
78 self.rebalance();
79
80 ret
81 }
82
83 // 调整各节点的平衡因子
84 fn rebalance(&mut self) {

Callers 1

mainFunction · 0.45

Calls 2

cmpMethod · 0.45
rebalanceMethod · 0.45

Tested by

no test coverage detected