1use std::sync::{Arc, Mutex};
4
5use crate::traits::*;
6
7pub enum Direction {
10 Left,
11 Right,
12}
13
14#[derive(Clone, Copy)]
16pub enum DeltaDiff {
17 Longer,
18 Zero,
19 Shorter,
20}
21
22pub struct AvlNode<T> {
24 pub value: T,
26 pub diff: i32,
30 pub n_ledu: (usize, usize),
35 pub left: Option<Arc<Mutex<Self>>>,
37 pub right: Option<Arc<Mutex<Self>>>,
39}
40
41impl<T: TreeElem> AvlNode<T> {
42 pub fn new(value: T) -> Self {
44 Self { value, diff: 0, n_ledu: (0, 0), left: None, right: None }
45 }
46
47 pub fn push_child(&mut self, value: T) -> ((usize, usize), DeltaDiff) {
49 if value < self.value {
50 self.n_ledu.0 += 1;
51 match &self.left {
52 Some(node) => {
53 let (n_ledu, d_diff) = node.lock().unwrap().push_child(value);
54
55 (n_ledu, self.balance(d_diff, Direction::Left))
56 }
57 _ => {
58 self.left = Some(Arc::new(Mutex::new(Self::new(value))));
59
60 ((0, 0), self.balance(DeltaDiff::Longer, Direction::Left))
61 }
62 }
63 } else if value > self.value {
64 match &self.right {
65 Some(node) => {
66 let (n_ledu, d_diff) = node.lock().unwrap().push_child(value);
67
68 ((n_ledu.0 + self.n_ledu.0 + self.n_ledu.1 + 1, n_ledu.1), self.balance(d_diff, Direction::Right))
69 }
70 _ => {
71 self.right = Some(Arc::new(Mutex::new(Self::new(value))));
72
73 ((self.n_ledu.0 + self.n_ledu.1 + 1, 0), self.balance(DeltaDiff::Longer, Direction::Right))
74 }
75 }
76 } else {
77 self.n_ledu.1 += 1;
78 (self.n_ledu, DeltaDiff::Zero)
79 }
80 }
81
82 pub fn search(&self, value: T) -> Option<usize> {
84 if value == self.value {
85 Some(self.n_ledu.1)
86 } else {
87 if value < self.value {
88 match &self.left {
89 Some(node) => node.lock().unwrap().search(value),
90 None => None,
91 }
92 } else {
93 match &self.right {
94 Some(node) => node.lock().unwrap().search(value),
95 None => None,
96 }
97 }
98 }
99 }
100
101 pub fn remove_child(&mut self, value: T) -> Result<DeltaDiff, ()> {
105 if value == self.value {
106 return Err(());
107 }
108 if value < self.value {
109 let (new_child, fin, reconnect) = match &self.left {
110 Some(node) => {
111 let mut n = node.lock().unwrap();
112 if n.value == value {
113 if n.n_ledu.1 > 0 {
114 n.n_ledu.1 -= 1;
115 (None, Ok(Some(DeltaDiff::Zero)), false)
116 } else {
117 n.remove_reconnect()
118 }
119 } else {
120 (None, Err(()), false)
121 }
122 }
123 None => (None, Ok(None), false),
124 };
125 if reconnect {
126 self.left = new_child;
127 }
128 match fin {
129 Ok(Some(d_diff)) => {
130 Ok(self.balance(d_diff, Direction::Left))
131 }
132 Ok(None) => {
133 Err(())
134 }
135 Err(()) => {
136 match self.left.clone().unwrap().lock().unwrap().remove_child(value) {
137 Ok(d_diff) => {
138 Ok(self.balance(d_diff, Direction::Left))
139 }
140 Err(()) => Err(())
141 }
142 }
143 }
144 } else {
145 let (new_child, fin, reconnect) = match &self.right {
146 Some(node) => {
147 let mut n = node.lock().unwrap();
148 if n.value == value {
149 if n.n_ledu.1 > 0 {
150 n.n_ledu.1 -= 1;
151 (None, Ok(Some(DeltaDiff::Zero)), false)
152 } else {
153 n.remove_reconnect()
154 }
155 } else {
156 (None, Err(()), false)
157 }
158 }
159 None => (None, Ok(None), false),
160 };
161 if reconnect {
162 self.right = new_child;
163 }
164 match fin {
165 Ok(Some(d_diff)) => {
166 Ok(self.balance(d_diff, Direction::Right))
167 }
168 Ok(None) => {
169 Err(())
170 }
171 Err(()) => {
172 match self.right.clone().unwrap().lock().unwrap().remove_child(value) {
173 Ok(d_diff) => {
174 Ok(self.balance(d_diff, Direction::Right))
175 }
176 Err(()) => Err(())
177 }
178 }
179 }
180 }
181 }
182
183 fn remove_reconnect(&mut self) -> (Option<Arc<Mutex<Self>>>, Result<Option<DeltaDiff>, ()>, bool) {
185 match (&self.left, &self.right) {
186 (Some(nl), Some(nr)) => {
187 let n_m = if self.diff >= 0 {
188 nl.lock().unwrap().max_child()
189 } else {
190 nr.lock().unwrap().min_child()
191 };
192 self.value = n_m;
193 self.n_ledu.1 = self.search(n_m).unwrap();
194 match self.remove_child(n_m) {
195 Ok(d_diff) => (None, Ok(Some(d_diff)), false),
196 Err(()) => panic!(),
197 }
198 }
199 (Some(nl), None) => {
200 (Some(nl.clone()), Ok(Some(self.balance(DeltaDiff::Shorter, Direction::Left))), true)
201 }
202 (None, Some(nr)) => {
203 (Some(nr.clone()), Ok(Some(self.balance(DeltaDiff::Shorter, Direction::Right))), true)
204 }
205 (None, None) => {
206 (None, Ok(Some(DeltaDiff::Shorter)), true)
207 }
208 }
209 }
210
211 pub fn balance(&mut self, d_diff: DeltaDiff, from_dir: Direction) -> DeltaDiff {
213 match d_diff {
214 DeltaDiff::Zero => DeltaDiff::Zero,
215 DeltaDiff::Longer => {
216 match from_dir {
217 Direction::Left => {
218 self.diff += 1;
219 if self.rotate() {
220 DeltaDiff::Zero
221 } else {
222 if self.diff > 0 {
223 DeltaDiff::Longer
224 } else {
225 DeltaDiff::Zero
226 }
227 }
228 }
229 Direction::Right => {
230 self.diff -= 1;
231 if self.rotate() {
232 DeltaDiff::Zero
233 } else {
234 if self.diff < 0 {
235 DeltaDiff::Longer
236 } else {
237 DeltaDiff::Zero
238 }
239 }
240 }
241 }
242 }
243 DeltaDiff::Shorter => {
244 match from_dir {
245 Direction::Left => {
246 self.diff -= 1;
247 if self.diff == -2 {
248 let d_diff_rotate = match &self.right {
249 None => panic!(),
250 Some(node) => {
251 if node.lock().unwrap().diff == 0 {
252 DeltaDiff::Zero
253 } else {
254 DeltaDiff::Shorter
255 }
256 }
257 };
258 let _ = self.rotate();
259 d_diff_rotate
260 } else if self.diff <= 1 && self.diff >= -1 {
261 if self.diff >= 0 {
262 DeltaDiff::Shorter
263 } else {
264 DeltaDiff::Zero
265 }
266 } else {
267 panic!()
268 }
269 }
270 Direction::Right => {
271 self.diff += 1;
272 if self.diff == 2 {
273 let d_diff_rotate = match &self.left {
274 None => panic!(),
275 Some(node) => {
276 if node.lock().unwrap().diff == 0 {
277 DeltaDiff::Zero
278 } else {
279 DeltaDiff::Shorter
280 }
281 }
282 };
283 d_diff_rotate
284 } else if self.diff <= 1 && self.diff >= -1 {
285 if self.diff <= 0 {
286 DeltaDiff::Shorter
287 } else {
288 DeltaDiff::Zero
289 }
290 } else {
291 panic!()
292 }
293 }
294 }
295 }
296 }
297 }
298
299 pub fn rotate(&mut self) -> bool {
301 if self.diff <= 1 && self.diff >= -1 {
302 return false;
303 }
304 if self.diff == 2 {
305 let n_val = self.value;
306 let n_n_ledu1 = self.n_ledu.1;
307 let nr = self.right.clone();
308 let (nl_val, nl_n_ledu1, n_diff, nll_op) = match &mut self.left {
309 None => panic!(),
310 Some(nl_arc) => {
311 let mut nl = nl_arc.lock().unwrap();
312 let nl_val = nl.value;
313 let nl_n_ledu1 = nl.n_ledu.1;
314 let nll_op = nl.left.clone();
315 if nl.diff == -1 {
316 let (nlr_val, nlr_n_ledu1, nlrr_op, diff) = match &mut nl.right {
317 None => panic!(),
318 Some(nlr_arc) => {
319 let mut nlr = nlr_arc.lock().unwrap();
320 let nlr_diff = nlr.diff;
321 let diff = if nlr_diff == -1 {
322 nlr.diff = 1;
323 1
324 } else if nlr_diff == 0 {
325 nlr.diff = 0;
326 1
327 } else if nlr_diff == 1 {
328 nlr.diff = 0;
329 2
330 } else {
331 panic!()
332 };
333 let nlr_val = nlr.value;
334 let nlr_n_ledu1 = nlr.n_ledu.1;
335 nlr.value = nl_val;
336 nlr.n_ledu.1 = nl_n_ledu1;
337 let nlrl_op = nlr.left.clone();
338 let nlrr_op = nlr.right.clone();
339 nlr.left = nll_op;
340 nlr.n_ledu.0 = match &nlr.left {
341 Some(node) => node.lock().unwrap().len_child_and_self(),
342 None => 0,
343 };
344 nlr.right = nlrl_op;
345 (nlr_val, nlr_n_ledu1, nlrr_op, diff)
346 }
347 };
348 nl.value = nlr_val;
349 nl.n_ledu.1 = nlr_n_ledu1;
350 let nlr_op = nl.right.clone();
351 nl.right = nlrr_op;
352 nl.left = nlr_op;
353 nl.n_ledu.0 = match &nl.left {
354 Some(node) => node.lock().unwrap().len_child_and_self(),
355 None => 0,
356 };
357 nl.diff = diff;
358 }
359 let n_diff = if nl.diff == 2 {
360 nl.diff = -1;
361 0
362 } else if nl.diff == 1 {
363 nl.diff = 0;
364 0
365 } else if nl.diff == 0 {
366 nl.diff = 1;
367 -1
368 } else {
369 panic!()
370 };
371 let nll_op = nl.left.clone();
372 nl.left = nl.right.clone();
373 nl.right = nr;
374 let nl_val = nl.value;
375 let nl_n_ledu1 = nl.n_ledu.1;
376 nl.value = n_val;
377 nl.n_ledu.1 = n_n_ledu1;
378 nl.n_ledu.0 = match &nl.left {
379 Some(node) => node.lock().unwrap().len_child_and_self(),
380 None => 0,
381 };
382 (nl_val, nl_n_ledu1, n_diff, nll_op)
383 }
384 };
385 self.value = nl_val;
386 self.n_ledu.1 = nl_n_ledu1;
387 self.diff = n_diff;
388 self.right = self.left.clone();
389 self.left = nll_op;
390 self.n_ledu.0 = match &self.left {
391 Some(node) => node.lock().unwrap().len_child_and_self(),
392 None => 0,
393 };
394
395 return true;
396 } else if self.diff == -2 {
397 let n_val = self.value;
398 let n_n_ledu1 = self.n_ledu.1;
399 let nl = self.left.clone();
400 let (nr_val, nr_n_ledu1, n_diff, nrr_op) = match &mut self.right {
401 None => {
402 panic!()
403 }
404 Some(nr_arc) => {
405 let mut nr = nr_arc.lock().unwrap();
406 let nr_val = nr.value;
407 let nr_n_ledu1 = nr.n_ledu.1;
408 let nrr_op = nr.right.clone();
409 if nr.diff == 1 {
410 let (nrl_val, nrl_n_ledu1, nrll_op, diff) = match &mut nr.left {
411 None => panic!(),
412 Some(nrl_arc) => {
413 let mut nrl = nrl_arc.lock().unwrap();
414 let nrl_diff = nrl.diff;
415 let diff = if nrl_diff == 1 {
416 nrl.diff = -1;
417 -1
418 } else if nrl_diff == 0 {
419 nrl.diff = 0;
420 -1
421 } else if nrl_diff == -1 {
422 nrl.diff = 0;
423 -2
424 } else {
425 panic!()
426 };
427 let nrl_val = nrl.value;
428 let nrl_n_ledu1 = nrl.n_ledu.1;
429 nrl.value = nr_val;
430 nrl.n_ledu.1 = nr_n_ledu1;
431 let nrlr_op = nrl.right.clone();
432 let nrll_op = nrl.left.clone();
433 nrl.right = nrr_op;
434 nrl.left = nrlr_op;
435 nrl.n_ledu.0 = match &nrl.left {
436 Some(node) => node.lock().unwrap().len_child_and_self(),
437 None => 0,
438 };
439 (nrl_val, nrl_n_ledu1, nrll_op, diff)
440 }
441 };
442 nr.value = nrl_val;
443 nr.n_ledu.1 = nrl_n_ledu1;
444 let nrl_op = nr.left.clone();
445 nr.left = nrll_op;
446 nr.n_ledu.0 = match &nr.left {
447 Some(node) => node.lock().unwrap().len_child_and_self(),
448 None => 0,
449 };
450 nr.right = nrl_op;
451 nr.diff = diff;
452 }
453 let n_diff = if nr.diff == -2 {
454 nr.diff = 1;
455 0
456 } else if nr.diff == -1 {
457 nr.diff = 0;
458 0
459 } else if nr.diff == 0 {
460 nr.diff = -1;
461 1
462 } else {
463 panic!()
464 };
465 let nrr_op = nr.right.clone();
466 nr.right = nr.left.clone();
467 nr.left = nl;
468 let nr_val = nr.value;
469 let nr_n_ledu1 = nr.n_ledu.1;
470 nr.value = n_val;
471 nr.n_ledu.1 = n_n_ledu1;
472 nr.n_ledu.0 = match &nr.left {
473 Some(node) => node.lock().unwrap().len_child_and_self(),
474 None => 0,
475 };
476 (nr_val, nr_n_ledu1, n_diff, nrr_op)
477 }
478 };
479 self.value = nr_val;
480 self.n_ledu.1 = nr_n_ledu1;
481 self.diff = n_diff;
482 self.left = self.right.clone();
483 self.right = nrr_op;
484 self.n_ledu.0 = match &self.left {
485 Some(node) => node.lock().unwrap().len_child_and_self(),
486 None => 0,
487 };
488
489 return true;
490 } else {
491 panic!()
492 }
493 }
494
495 pub fn max_child(&self) -> T {
497 match &self.right {
498 Some(node) => node.lock().unwrap().max_child(),
499 None => self.value,
500 }
501 }
502
503 pub fn pop_max_child(&mut self) -> Result<(T, DeltaDiff), ()> {
508 let res = match &self.right {
509 Some(node) => {
510 let mut n = node.lock().unwrap();
511 match &n.right {
512 Some(_) => {
513 match &n.pop_max_child() {
514 Ok((value, d_diff)) => Ok((*value, *d_diff, None)),
515 Err(()) => Err(()),
516 }
517 }
518 None => {
519 let value = n.value;
520 if n.n_ledu.1 > 0 {
521 n.n_ledu.1 -= 1;
522 Ok((value, DeltaDiff::Zero, None))
523 } else {
524 Ok((value, DeltaDiff::Shorter, Some(n.left.clone())))
525 }
526 }
527 }
528 }
529 None => Err(()),
530 };
531 match res {
532 Ok((value, d_diff, reconnect)) => {
533 match reconnect {
534 Some(node_left) => { self.right = node_left; }
535 None => {}
536 }
537 Ok((value, self.balance(d_diff, Direction::Right)))
538 }
539 Err(()) => Err(()),
540 }
541 }
542
543 pub fn pop_max_all_child(&mut self) -> Result<((T, usize), DeltaDiff), ()> {
546 let res = match &self.right {
547 Some(node) => {
548 let mut n = node.lock().unwrap();
549 match &n.right {
550 Some(_) => {
551 match &n.pop_max_all_child() {
552 Ok((value, d_diff)) => Ok((*value, *d_diff, None)),
553 Err(()) => Err(()),
554 }
555 }
556 None => {
557 let value = n.value;
558 Ok(((value, n.n_ledu.1), DeltaDiff::Zero, Some(n.left.clone())))
559 }
560 }
561 }
562 None => Err(()),
563 };
564 match res {
565 Ok((value, d_diff, reconnect)) => {
566 match reconnect {
567 Some(node_left) => { self.right = node_left; }
568 None => {}
569 }
570 Ok((value, self.balance(d_diff, Direction::Right)))
571 }
572 Err(()) => Err(()),
573 }
574 }
575
576 pub fn min_child(&self) -> T {
578 match &self.left {
579 Some(node) => node.lock().unwrap().max_child(),
580 None => self.value,
581 }
582 }
583
584 pub fn pop_min_child(&mut self) -> Result<(T, DeltaDiff), ()> {
589 let res = match &self.left {
590 Some(node) => {
591 let mut n = node.lock().unwrap();
592 match &n.left {
593 Some(_) => {
594 match &n.pop_min_child() {
595 Ok((value, d_diff)) => Ok((*value, *d_diff, None)),
596 Err(()) => Err(()),
597 }
598 }
599 None => {
600 let value = n.value;
601 if n.n_ledu.1 > 0 {
602 n.n_ledu.1 -= 1;
603 Ok((value, DeltaDiff::Zero, None))
604 } else {
605 Ok((value, DeltaDiff::Shorter, Some(n.right.clone())))
606 }
607 }
608 }
609 }
610 None => Err(()),
611 };
612 match res {
613 Ok((value, d_diff, reconnect)) => {
614 match reconnect {
615 Some(node_right) => { self.left = node_right; }
616 None => {}
617 }
618 Ok((value, self.balance(d_diff, Direction::Left)))
619 }
620 Err(()) => Err(()),
621 }
622 }
623
624 pub fn pop_min_all_child(&mut self) -> Result<((T, usize), DeltaDiff), ()> {
627 let res = match &self.left {
628 Some(node) => {
629 let mut n = node.lock().unwrap();
630 match &n.left {
631 Some(_) => {
632 match &n.pop_min_all_child() {
633 Ok((value, d_diff)) => Ok((*value, *d_diff, None)),
634 Err(()) => Err(()),
635 }
636 }
637 None => {
638 Ok(((n.value, n.n_ledu.1), DeltaDiff::Shorter, Some(n.right.clone())))
639 }
640 }
641 }
642 None => Err(()),
643 };
644 match res {
645 Ok((value, d_diff, reconnect)) => {
646 match reconnect {
647 Some(node_right) => { self.left = node_right; }
648 None => {}
649 }
650
651 Ok((value, self.balance(d_diff, Direction::Left)))
652 }
653 Err(()) => Err(()),
654 }
655 }
656
657 pub fn len_child_and_self(&self) -> usize {
659 match &self.right {
660 Some(node) => self.n_ledu.0 + self.n_ledu.1 + 1 + node.lock().unwrap().len_child_and_self(),
661 None => self.n_ledu.0 + self.n_ledu.1 + 1,
662 }
663 }
664
665 pub fn height_child(&self) -> usize {
667 if self.diff >= 0 {
668 match &self.left {
669 Some(node) => 1 + node.lock().unwrap().height_child(),
670 None => 1,
671 }
672 } else {
673 match &self.right {
674 Some(node) => 1 + node.lock().unwrap().height_child(),
675 None => 1,
676 }
677 }
678 }
679
680 pub fn check_diff(&self) {
682 let hl = match &self.left {
683 Some(node) => node.lock().unwrap().height_child(),
684 None => 0,
685 } as i32;
686 let hr = match &self.right {
687 Some(node) => node.lock().unwrap().height_child(),
688 None => 0,
689 } as i32;
690 let diff = hl - hr;
691 if diff != self.diff {
692 panic!("Diff value is incorrect!: diff={}, left={}, right={}", self.diff, hl, hr);
693 }
694 }
695}
696