插入节点
(&mut self, key: T)
| 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 | } |