1use std::cell::RefCell;
2use std::rc::Rc;
3
4use super::tree::BaseTree;
5use super::tree::Tree;
6
7use super::node::Node;
8use super::node::{paint, endpaint};
9use super::node::*;
10
11#[macro_export]
15macro_rules! redblack {
16 ( $( $x:expr ),* ) => {
17 {
18 let mut temp_tree = RBTree::new();
19 $(
20 temp_tree.insert($x);
21 )*
22 temp_tree
23 }
24 };
25}
26
27#[derive(Debug)]
28pub struct ColorNode<T> {
29 pub value: T,
30 pub ptr: usize,
31 pub parent: Option<usize>,
32 pub lchild: Option<usize>,
33 pub rchild: Option<usize>,
34 pub color: Color,
35 data: Rc<RefCell<Vec<ColorNode<T>>>>,
36}
37
38pub trait ColoredNode<T>: Node<T> {
39 fn new(val: T, selfptr: usize, data: Rc<RefCell<Vec<ColorNode<T>>>>) -> Self;
40 fn is_red(&self) -> bool;
41 fn is_child_black(&self, side: Side) -> bool;
42 fn is_parent_black(&self) -> bool;
43 fn is_sibling_black(&self) -> bool;
44}
45
46impl<T> ColoredNode<T> for ColorNode<T>
47where
48 T: std::fmt::Debug,
49 T: std::cmp::PartialOrd,
50{
51 fn new(val: T, selfptr: usize, data: Rc<RefCell<Vec<ColorNode<T>>>>) -> Self {
52 Self {
53 value: val,
54 ptr: selfptr,
55 parent: None,
56 lchild: None,
57 rchild: None,
58 color: Color::Black,
59 data: data,
60 }
61 }
62
63 fn is_red(&self) -> bool {
64 match self.color {
65 Color::Red => true,
66 Color::Black => false,
67 }
68 }
69
70 fn is_child_black(&self, side: Side) -> bool {
72 let child = self.get_child(side);
73 if child.is_some() && self.get(child.unwrap()).is_red() {
74 false
75 } else {
76 true
77 }
78 }
79
80 fn is_parent_black(&self) -> bool {
82 let p = self.parent.unwrap();
83 !self.get(p).is_red()
84 }
85
86 fn is_sibling_black(&self) -> bool {
88 let sib = self.get_sibling();
89 if sib.is_some() && self.get(sib.unwrap()).is_red() {
90 false
91 } else {
92 true
93 }
94 }
95}
96
97impl<T: std::fmt::Debug + std::cmp::PartialOrd> Node<T> for ColorNode<T> {
98 fn to_self_string(&self) -> String {
99 format!(
100 "[P:{:?} C:{:?} V:{:?}]",
101 self.parent, self.color, self.value
102 )
103 }
104 fn to_self_string_display(&self) -> (String, usize) {
105 const RED: usize = 1;
106 const BLK: usize = 0;
107 const FG: usize = 30;
108 const BG: usize = 40;
109 if self.is_red() {
110 (
111 format!(
112 "{}{:?}{}",
113 paint(FG + BLK, BG + RED),
114 self.value,
115 endpaint()
116 ),
117 format!("{:?}", self.value).len(),
118 )
119 } else {
120 (
121 format!(
122 "{}{:?}{}",
123 paint(FG + RED, BG + BLK),
124 self.value,
125 endpaint()
126 ),
127 format!("{:?}", self.value).len(),
128 )
129 }
130 }
131
132 fn is(&self, val: &T) -> bool {
133 &self.value == val
134 }
135 fn greater(&self, val: &T) -> bool {
136 &self.value > val
137 }
138 fn lesser(&self, val: &T) -> bool {
139 &self.value < val
140 }
141
142 fn get_value(&self) -> &T {
143 &self.value
144 }
145 fn get(&self, ptr: usize) -> &ColorNode<T> {
152 unsafe { &(*self.data.as_ptr())[ptr] }
153 }
154
155 fn get_mut(&self, ptr: usize) -> &mut ColorNode<T> {
156 unsafe { &mut (*self.data.as_ptr())[ptr] }
157 }
158
159 fn get_child(&self, side: Side) -> Option<usize> {
160 match side {
161 Side::Left => self.lchild,
162 Side::Right => self.rchild,
163 }
164 }
165
166 fn set_child(&mut self, child: usize, side: Side) {
167 self.set_child_opt(Some(child), side)
168 }
169
170 fn set_child_opt(&mut self, c: Option<usize>, side: Side) {
171 match side {
172 Side::Left => self.lchild = c,
173 Side::Right => self.rchild = c,
174 };
175 if let Some(child) = c {
176 self.get_mut(child).parent = Some(self.location());
177 }
178 }
179 fn set_parent(&mut self, p: Option<usize>) {
180 self.parent = p;
181 }
182
183 fn get_parent(&self) -> Option<usize> {
184 self.parent
185 }
186
187 fn location(&self) -> usize {
188 self.ptr
189 }
190}
191
192#[derive(Debug)]
196pub struct RBTree<T> {
197 root: Option<usize>,
198 size: usize,
199 data: Rc<RefCell<Vec<ColorNode<T>>>>,
200 free: Vec<usize>,
201}
202
203impl<T> Tree<T> for RBTree<T>
204where
205 T: PartialOrd,
206 T: PartialEq,
207 T: std::fmt::Debug,
208{
209 fn new() -> Self {
210 Self {
211 root: None,
212 data: Rc::new(RefCell::new(Vec::new())),
213 size: 0,
214 free: Vec::new(),
215 }
216 }
217}
218const TREE_END: usize = 0xFFFFFFFF;
219impl<T> BaseTree<T> for RBTree<T>
220where
221 T: PartialOrd,
222 T: PartialEq,
223 T: std::fmt::Debug,
224{
225 type MNode = ColorNode<T>;
226 fn get(&self, val: usize) -> &Self::MNode {
236 unsafe { &(*self.data.as_ptr())[val] }
237 }
238
239 fn get_mut(&self, val: usize) -> &mut Self::MNode {
240 unsafe { &mut (*self.data.as_ptr())[val] }
241 }
242
243 fn get_root(&self) -> Option<usize> {
244 self.root
245 }
246
247 fn set_root(&mut self, new_root: Option<usize>) {
248 self.root = new_root
249 }
250
251 fn crement_size(&mut self, amount: isize) {
252 self.size = (self.size as isize + amount) as usize;
253 }
254
255 fn attach_child(&self, p: usize, c: usize, side: Side) {
256 self.get_mut(p).set_child(c, side)
257 }
258
259 fn rebalance_ins(&mut self, n: usize) {
260 self.fix_ins_color(n);
261 }
262
263 fn rebalance_del(&mut self, n: usize, child: usize) {
264 if self.get(n).ptr == TREE_END || self.get(child).ptr == TREE_END {
273 self.fix_del_color_long();
274 } else {
275 self.fix_del_color(n, child)
276 }
277 }
278
279 fn delete_replace(&mut self, n: usize) -> usize {
280 self.get_mut(n).ptr = TREE_END;
281 n
282 }
283
284 fn replace_node(&mut self, to_delete: usize, to_attach: Option<usize>) {
285 let node = self.get(to_delete);
286 self.get_mut(to_delete).ptr = TREE_END;
287 if let Some(p) = node.parent {
288 if node.is_child(Side::Left) {
289 self.get_mut(p).lchild = to_attach;
290 } else {
291 self.get_mut(p).rchild = to_attach;
292 }
293 } else {
294 self.root = to_attach;
295 }
296 }
297
298 fn get_size(&self) -> usize {
299 return self.size;
300 }
301
302 fn create_node(&mut self, val: T) -> usize {
303 let loc = self.data.borrow().len();
304 self.data
305 .borrow_mut()
306 .push(ColorNode::new(val, loc, self.data.clone()));
307 loc
308 }
309
310 fn delete_node(&mut self, index: usize) {
311 self.free.push(index);
312 }
313}
314
315impl<T> RBTree<T>
316where
317 T: PartialOrd,
318 T: PartialEq,
319 T: std::fmt::Debug,
320{
321 fn fix_del_color(&mut self, n: usize, child: usize) {
323 if !self.get(n).is_red() {
324 if self.get(child).is_red() {
325 self.get_mut(child).color = Color::Black;
326 } else {
327 self.delete_case_1(child);
328 }
329 }
330 }
331
332 fn set_maybe_black(&mut self, no: Option<usize>) {
335 if let Some(n) = no {
336 self.get_mut(n).color = Color::Black;
337 }
338 }
339
340 fn delete_case_1(&mut self, n: usize) {
341 if self.get(n).parent.is_some() {
342 self.delete_case_2(n);
343 }
344 }
345
346 fn delete_case_2(&mut self, n: usize) {
347 let s = self.get(n).get_sibling();
348 if self.get(n).is_sibling_black() {
349 let p = self.get(n).parent.expect("D2 P");
350 self.set_maybe_black(s);
351 self.get_mut(p).color = Color::Red;
352 self.rotate(self.get(n).side(), p);
353 }
354 self.delete_case_3(n);
355 }
356
357 fn delete_case_3(&mut self, n: usize) {
358 let s = self.get(n).get_sibling().expect("D3 S");
359 let p = self.get(n).parent.expect("D3 P");
360 if self.get(n).is_parent_black()
361 && !self.get(s).is_red()
362 && self.get(s).is_child_black(Side::Left)
363 && self.get(s).is_child_black(Side::Right)
364 {
365 self.delete_case_1(p);
366 } else {
367 self.delete_case_4(p);
368 }
369 }
370
371 fn delete_case_4(&mut self, n: usize) {
372 let node = self.get(n);
373 let s = node.get_sibling().expect("D4 S");
374 let p = node.parent.expect("D4 P");
375
376 if !node.is_parent_black()
377 && node.is_sibling_black()
378 && self.get(s).is_child_black(Side::Left)
379 && self.get(s).is_child_black(Side::Right)
380 {
381 self.get_mut(s).color = Color::Red;
382 self.get_mut(p).color = Color::Black;
383 } else {
384 self.delete_case_5(n)
385 }
386 }
387
388 fn delete_case_5(&mut self, n: usize) {
389 let s = self.get(n).get_sibling().expect("D5 S");
390 if !self.get(s).is_red() {
391 if self.get(n).is_child(Side::Left)
392 && self.get(s).is_child_black(Side::Right)
393 && !self.get(s).is_child_black(Side::Left)
394 {
395 let scl = self.get(s).get_child(Side::Left);
396 self.get_mut(s).color = Color::Red;
397 self.set_maybe_black(scl);
398 self.rotate(Side::Right, s);
399 } else if self.get(n).is_child(Side::Right)
400 && self.get(s).is_child_black(Side::Left)
401 && !self.get(s).is_child_black(Side::Right)
402 {
403 let scr = self.get(s).get_child(Side::Right);
404 self.get_mut(s).color = Color::Red;
405 self.set_maybe_black(scr);
406 self.rotate(Side::Left, s);
407 }
408 }
409 self.delete_case_6(n)
410 }
411
412 fn delete_case_6(&mut self, n: usize) {
413 let s = self.get(n).get_sibling().expect("D6 S");
414 let p = self.get(n).parent.expect("D6 P");
415 let pc = self.get(p).color;
416 self.get_mut(s).color = pc;
417 self.get_mut(p).color = Color::Black;
418
419 if self.get(n).is_child(Side::Left) {
420 let scr = self.get(s).get_child(Side::Right);
421 self.set_maybe_black(scr);
422 self.rotate(Side::Left, p);
423 } else {
424 let scl = self.get(s).get_child(Side::Left);
425 self.set_maybe_black(scl);
426 self.rotate(Side::Right, p);
427 }
428 }
429
430 fn fix_del_color_long(&mut self) {
431 let mut t = RBTree::new();
432 let mut v = self.data.borrow_mut().pop();
433 while v.is_some() {
434 let n = v.unwrap();
435 if n.ptr != TREE_END {
436 t.insert(n.value);
437 }
438 v = self.data.borrow_mut().pop();
439 }
440
441 *self = t;
447 self.size += 1;
448 }
449
450 fn fix_ins_color(&mut self, n: usize) {
451 self.get_mut(n).color = Color::Red;
452 if let Some(p) = self.get(n).parent {
453 if !self.get(p).is_red() {
454 } else if self.get(n).get_uncle().is_some()
457 && self.get(self.get(n).get_uncle().unwrap()).is_red()
458 {
459 let p = self.get(n).parent.unwrap();
461 let u = self.get(n).get_uncle().unwrap();
462 self.get_mut(p).color = Color::Black;
463 self.get_mut(u).color = Color::Black;
464 self.fix_ins_color(self.get(p).parent.unwrap());
465 } else {
466 self.do_ins_hard_case(n);
468 }
469 } else {
470 }
471 self.get_mut(self.root.unwrap()).color = Color::Black;
472 }
473
474 fn do_ins_hard_case(&mut self, nn: usize) {
475 let mut n = nn;
476 let mut p = self.get(n).parent.unwrap();
477 if self.get(p).is_child(Side::Left) && self.get(n).is_child(Side::Right) {
478 self.rotate(Side::Left, n);
479 n = self.get(n).get_child(Side::Left).unwrap();
480 }
481
482 p = self.get(n).parent.unwrap();
483 if self.get(p).is_child(Side::Right) && self.get(n).is_child(Side::Left) {
484 self.rotate(Side::Right, n);
485 n = self.get(n).get_child(Side::Right).unwrap();
486 }
487
488 self.do_ins_hard_case2(n);
489 }
490
491 fn do_ins_hard_case2(&mut self, n: usize) {
492 let p = self.get(n).parent.unwrap();
493 let g = self.get(p).parent.unwrap();
494
495 self.get_mut(p).color = Color::Black;
496 self.get_mut(g).color = Color::Red;
497 if self.get(p).is_child(Side::Right) {
498 self.rotate(Side::Left, p);
499 } else if self.get(p).is_child(Side::Left) {
500 self.rotate(Side::Right, p);
501 }
502 }
503
504 #[allow(dead_code)]
505 fn get_size_recursive(&self) -> usize {
506 if let Some(root) = self.root {
507 self.get(root).get_size()
508 } else {
509 0
510 }
511 }
512}
513
514#[cfg(test)]
515mod tests {
516 use super::*;
517
518 fn make_fake_tree_node_no_balance() -> RBTree<i32> {
535 let mut tree = RBTree::new();
536 for x in vec![50, 25, 75, 15, 35, 65, 85, 0, 20, 30, 40, 60, 70, 80, 100] {
537 tree.insert(x);
538 }
539
540 tree
541 }
542
543 #[test]
544 fn test_tree_print() {
545 let tree = make_fake_tree_node_no_balance();
546 assert_eq!(tree.to_string(), "([P:None C:Black V:50] ([P:Some(0) C:Red V:25] ([P:Some(1) C:Black V:15] ([P:Some(3) C:Red V:0] () ()) ([P:Some(3) C:Red V:20] () ())) ([P:Some(1) C:Black V:35] ([P:Some(4) C:Red V:30] () ()) ([P:Some(4) C:Red V:40] () ()))) ([P:Some(0) C:Red V:75] ([P:Some(2) C:Black V:65] ([P:Some(5) C:Red V:60] () ()) ([P:Some(5) C:Red V:70] () ())) ([P:Some(2) C:Black V:85] ([P:Some(6) C:Red V:80] () ()) ([P:Some(6) C:Red V:100] () ()))))");
547 let tree_empty = RBTree::<i32>::new();
548 assert_eq!(tree_empty.to_string(), "(Empty tree)");
549 }
550
551 #[test]
552 fn test_contains() {
553 let tree = make_fake_tree_node_no_balance();
554 assert!(tree.contains(&100));
555 assert!(tree.contains(&0));
556 assert!(tree.contains(&50));
557 assert!(tree.contains(&25));
558 assert!(tree.contains(&75));
559 assert!(tree.contains(&60));
560 assert!(tree.contains(&40));
561
562 assert!(!tree.contains(&42));
563 assert!(!tree.contains(&99));
564 assert!(!tree.contains(&1));
565 }
566
567 #[test]
568 fn test_insert() {
569 let mut tree = RBTree::<i32>::new();
570 for x in 0..10 {
571 double_size_test(&tree, x as usize);
572 tree.insert(x);
573 double_size_test(&tree, (x + 1) as usize);
574 }
575
576 assert_eq!(tree.to_string(), "([P:None C:Black V:3] ([P:Some(3) C:Black V:1] ([P:Some(1) C:Black V:0] () ()) ([P:Some(1) C:Black V:2] () ())) ([P:Some(3) C:Black V:5] ([P:Some(5) C:Black V:4] () ()) ([P:Some(5) C:Red V:7] ([P:Some(7) C:Black V:6] () ()) ([P:Some(7) C:Black V:8] () ([P:Some(8) C:Red V:9] () ())))))");
577 }
578
579 #[test]
580 fn test_insert_2() {
581 let mut tree = RBTree::<usize>::new();
582 let size = 15;
583 for x in (0..size).rev() {
584 tree.insert(x);
585 }
586
587 assert_eq!(tree.to_string(), "([P:None C:Black V:11] ([P:Some(3) C:Red V:7] ([P:Some(7) C:Black V:5] ([P:Some(9) C:Red V:3] ([P:Some(11) C:Black V:1] ([P:Some(13) C:Red V:0] () ()) ([P:Some(13) C:Red V:2] () ())) ([P:Some(11) C:Black V:4] () ())) ([P:Some(9) C:Black V:6] () ())) ([P:Some(7) C:Black V:9] ([P:Some(5) C:Black V:8] () ()) ([P:Some(5) C:Black V:10] () ()))) ([P:Some(3) C:Black V:13] ([P:Some(1) C:Black V:12] () ()) ([P:Some(1) C:Black V:14] () ())))");
588 }
589
590 fn double_size_test<T: PartialEq + PartialOrd + std::fmt::Debug>(
591 tree: &RBTree<T>,
592 expect: usize,
593 ) {
594 assert_eq!(tree.get_size(), expect);
595 assert_eq!(tree.get_size_recursive(), expect);
596 }
597
598 #[test]
599 fn test_height() {
600 let tree = make_fake_tree_node_no_balance();
601 assert_eq!(tree.get_height(), 4);
602
603 let mut tree2 = RBTree::<i32>::new();
604 for x in 0..10 {
605 tree2.insert(x);
606 }
607 assert_eq!(tree2.get_height(), 5);
608
609 let tree3 = RBTree::<i32>::new();
610 assert_eq!(tree3.get_height(), 0);
611 }
612
613 #[test]
614 fn test_delete_mem() {
615 let mut tree = make_fake_tree_node_no_balance();
616 double_size_test(&tree, 15);
617
618 tree.delete(1);
619 double_size_test(&tree, 15);
620
621 tree.delete(0);
622 double_size_test(&tree, 14);
623 tree.insert(0);
624 double_size_test(&tree, 15);
625
626 tree.delete(50);
627 double_size_test(&tree, 14);
628 tree.insert(50);
629 double_size_test(&tree, 15);
630 }
631
632 #[test]
633 fn test_delete() {
634 let mut tree = RBTree::new();
635 for x in 0..15 {
636 tree.insert(x);
637 }
638 double_size_test(&tree, 15);
639 tree.delete(14);
640 tree.delete(12);
641 tree.delete(13);
642 assert_eq!(tree.to_string(), "([P:None C:Black V:8] ([P:Some(3) C:Black V:4] ([P:Some(7) C:Red V:2] ([P:Some(9) C:Black V:1] ([P:Some(10) C:Red V:0] () ()) ()) ([P:Some(9) C:Black V:3] () ())) ([P:Some(7) C:Red V:6] ([P:Some(5) C:Black V:5] () ()) ([P:Some(5) C:Black V:7] () ()))) ([P:Some(3) C:Black V:10] ([P:Some(1) C:Black V:9] () ()) ([P:Some(1) C:Black V:11] () ())))");
643 }
644
645 #[test]
646 fn find_leaf_count() {
647 let mut tree = RBTree::new();
648 for x in 0..15 {
649 tree.insert(x);
650 }
651 assert_eq!(tree.get_leaf_count(), 8);
652
653 let mut tree = RBTree::new();
654 for x in 0..100 {
655 tree.insert(x);
656 }
657 assert_eq!(tree.get_leaf_count(), 50);
658 }
659
660 #[test]
661 fn is_empty() {
662 let mut tree = RBTree::new();
663 assert!(tree.is_empty());
664 tree.insert(1);
665 assert!(!tree.is_empty());
666 tree.delete(1);
667 assert!(tree.is_empty());
668 }
669}