@@ -626,7 +626,7 @@ fn insert<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: K,
626
626
}
627
627
628
628
fn remove< K : Ord , V > ( node: & mut Option < ~TreeNode < K , V > > , key: & K ) -> bool {
629
- fn heir_swap<K : Ord , V >( node: & mut TreeNode <K , V >,
629
+ fn heir_swap<K : Ord , V >( node: & mut ~ TreeNode <K , V >,
630
630
child: & mut Option <~TreeNode <K , V >>) {
631
631
// *could* be done without recursion, but it won't borrow check
632
632
do child. mutate |mut child| {
@@ -640,15 +640,15 @@ fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
640
640
}
641
641
}
642
642
643
- if node. is_none( ) {
643
+ match * node {
644
+ None => {
644
645
return false // bottom of tree
645
- } else {
646
- let mut save = node. swap_unwrap( ) ;
647
-
648
- let removed = if save. key < * key {
649
- 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)
650
650
} else if * key < save. key {
651
- remove( & mut save. left, key)
651
+ ( remove( & mut save. left, key) , false )
652
652
} else {
653
653
if save. left. is_some( ) {
654
654
if save. right. is_some( ) {
@@ -662,16 +662,22 @@ fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
662
662
save. left = Some ( left) ;
663
663
remove( & mut save. left, key) ;
664
664
} else {
665
- save = save. left. swap_unwrap( ) ;
665
+ * save = save. left. swap_unwrap( ) ;
666
666
}
667
+ ( true, false)
667
668
} else if save. right. is_some( ) {
668
- save = save. right. swap_unwrap( ) ;
669
+ * save = save. right. swap_unwrap( ) ;
670
+ ( true, false)
669
671
} else {
670
- return true // leaf
672
+ ( true, true )
671
673
}
672
- true
673
674
} ;
674
675
676
+ if this {
677
+ * node = None ;
678
+ return true;
679
+ }
680
+
675
681
let left_level = save. left. map_default( 0 , |x| x. level) ;
676
682
let right_level = save. right. map_default( 0 , |x| x. level) ;
677
683
@@ -683,7 +689,7 @@ fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
683
689
do save. right. mutate |mut x| { x. level = save. level; x }
684
690
}
685
691
686
- skew( & mut save) ;
692
+ skew( save) ;
687
693
688
694
match save. right {
689
695
Some ( ref mut right) => {
@@ -696,15 +702,15 @@ fn remove<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
696
702
None => ( )
697
703
}
698
704
699
- split( & mut save) ;
705
+ split( save) ;
700
706
match save. right {
701
707
Some ( ref mut x) => { split( x) } ,
702
708
None => ( )
703
709
}
704
710
}
705
711
706
- * node = Some ( save) ;
707
712
removed
713
+ }
708
714
}
709
715
}
710
716
0 commit comments