@@ -576,63 +576,62 @@ pure fn each_reverse<K: Ord, V>(node: &r/Option<~TreeNode<K, V>>,
576
576
}
577
577
578
578
// Remove left horizontal link by rotating right
579
- fn skew<K : Ord , V >( mut node: ~ TreeNode < K , V > ) -> ~TreeNode <K , V > {
579
+ fn skew<K : Ord , V >( node: & mut ~TreeNode <K , V >) {
580
580
if node. left. map_default( false, |x| x. level == node. level) {
581
581
let mut save = node. left. swap_unwrap( ) ;
582
582
node. left <-> save. right; // save.right now None
583
- save. right = Some ( node) ;
584
- save
585
- } else {
586
- node // nothing to do
583
+ * node <-> save;
584
+ node. right = Some ( save) ;
587
585
}
588
586
}
589
587
590
588
// Remove dual horizontal link by rotating left and increasing level of
591
589
// the parent
592
- fn split<K : Ord , V >( mut node: ~ TreeNode < K , V > ) -> ~TreeNode <K , V > {
590
+ fn split<K : Ord , V >( node: & mut ~TreeNode <K , V >) {
593
591
if node. right. map_default( false,
594
592
|x| x. right. map_default( false, |y| y. level == node. level) ) {
595
593
let mut save = node. right. swap_unwrap( ) ;
596
594
node. right <-> save. left; // save.left now None
597
- save. left = Some ( node) ;
598
595
save. level += 1 ;
599
- save
600
- } else {
601
- node // nothing to do
596
+ * node <-> save;
597
+ node. left = Some ( save) ;
602
598
}
603
599
}
604
600
605
601
fn insert<K : Ord , V >( node: & mut Option <~TreeNode <K , V >>, key: K ,
606
602
value: V ) -> bool {
607
- if node. is_none( ) {
608
- * node = Some ( ~TreeNode :: new ( key, value) ) ;
609
- true
610
- } else {
611
- let mut save = node. swap_unwrap( ) ;
603
+ match * node {
604
+ Some ( ref mut save) => {
612
605
if key < save. key {
613
606
let inserted = insert( & mut save. left, key, value) ;
614
- * node = Some ( split( skew( save) ) ) ; // re-balance, if necessary
607
+ skew( save) ;
608
+ split( save) ;
615
609
inserted
616
610
} else if save. key < key {
617
611
let inserted = insert( & mut save. right, key, value) ;
618
- * node = Some ( split( skew( save) ) ) ; // re-balance, if necessary
612
+ skew( save) ;
613
+ split( save) ;
619
614
inserted
620
615
} else {
621
616
save. key = key;
622
617
save. value = value;
623
- * node = Some ( save) ;
624
618
false
625
619
}
620
+ }
621
+ None => {
622
+ * node = Some ( ~TreeNode :: new ( key, value) ) ;
623
+ true
624
+ }
626
625
}
627
626
}
628
627
629
628
fn remove< K : Ord , V > ( node: & mut Option < ~TreeNode < K , V > > , key: & K ) -> bool {
630
- fn heir_swap< K : Ord , V > ( node: & mut TreeNode < K , V > ,
629
+ fn heir_swap<K : Ord , V >( node: & mut ~ TreeNode <K , V >,
631
630
child: & mut Option <~TreeNode <K , V >>) {
632
631
// *could* be done without recursion, but it won't borrow check
633
632
do child. mutate |mut child| {
634
633
if child. right. is_some( ) {
635
- heir_swap( & mut * node, & mut child. right) ;
634
+ heir_swap( node, & mut child. right) ;
636
635
} else {
637
636
node. key <-> child. key;
638
637
node. value <-> child. value;
@@ -641,15 +640,15 @@ fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
641
640
}
642
641
}
643
642
644
- if node. is_none ( ) {
643
+ match * node {
644
+ None => {
645
645
return false // bottom of tree
646
- } else {
647
- let mut save = node. swap_unwrap ( ) ;
648
-
649
- let removed = if save. key < * key {
650
- remove ( & mut save. right , key)
646
+ }
647
+ Some ( ref mut save) => {
648
+ let ( removed, this) = if save. key < * key {
649
+ ( remove( & mut save. right, key) , false)
651
650
} else if * key < save. key {
652
- remove ( & mut save. left , key)
651
+ ( remove( & mut save. left, key) , false )
653
652
} else {
654
653
if save. left. is_some( ) {
655
654
if save. right. is_some( ) {
@@ -663,16 +662,22 @@ fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
663
662
save. left = Some ( left) ;
664
663
remove( & mut save. left, key) ;
665
664
} else {
666
- save = save. left . swap_unwrap ( ) ;
665
+ * save = save. left. swap_unwrap( ) ;
667
666
}
667
+ ( true, false)
668
668
} else if save. right. is_some( ) {
669
- save = save. right . swap_unwrap ( ) ;
669
+ * save = save. right. swap_unwrap( ) ;
670
+ ( true, false)
670
671
} else {
671
- return true // leaf
672
+ ( true, true )
672
673
}
673
- true
674
674
} ;
675
675
676
+ if this {
677
+ * node = None ;
678
+ return true;
679
+ }
680
+
676
681
let left_level = save. left. map_default( 0 , |x| x. level) ;
677
682
let right_level = save. right. map_default( 0 , |x| x. level) ;
678
683
@@ -684,19 +689,28 @@ fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
684
689
do save. right. mutate |mut x| { x. level = save. level; x }
685
690
}
686
691
687
- save = skew ( save) ;
692
+ skew( save) ;
693
+
694
+ match save. right {
695
+ Some ( ref mut right) => {
696
+ skew( right) ;
697
+ match right. right {
698
+ Some ( ref mut x) => { skew( x) } ,
699
+ None => ( )
700
+ }
701
+ }
702
+ None => ( )
703
+ }
688
704
689
- do save. right . mutate |mut right| {
690
- right = skew ( right ) ;
691
- right . right . mutate ( skew ) ;
692
- right
705
+ split ( save) ;
706
+ match save . right {
707
+ Some ( ref mut x ) => { split ( x ) } ,
708
+ None => ( )
693
709
}
694
- save = split ( save) ;
695
- save. right . mutate ( split) ;
696
710
}
697
711
698
- * node = Some ( save) ;
699
712
removed
713
+ }
700
714
}
701
715
}
702
716
0 commit comments