use std::rc::Rc;
use std::fmt;
type Handle<T> = Option<Box<Node<T>>>;
struct Node<T> {
level: i32,
value: T,
left: Handle<T>,
right: Handle<T>,
}
impl<T> Node<T> {
fn new(value: T) -> Node<T> {Node {level: 1i32, value: value, left: None, right: None}}
fn handle(value: T) -> Handle<T> {Some(Box::new(Node::new(value)))}
}
impl<T: fmt::Debug> fmt::Debug for Node<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if let Some(l) = self.left.as_ref() {
if let Some(r) = self.right.as_ref() {
write!(f, "[{:?}] {:?}:{} [{:?}]", l, self.value, self.level, r)
} else {
write!(f, "[{:?}] {:?}:{}", l, self.value, self.level)
}
} else {
if let Some(r) = self.right.as_ref() {
write!(f, "{:?}:{} [{:?}]", self.value, self.level, r)
} else {
write!(f, "{:?}:{}", self.value, self.level)
}
}
}
}
trait HandleFunctions<T> {
fn recursive_left(&self) -> &Handle<T>;
fn recursive_right(&self) -> &Handle<T>;
fn take_left(&mut self) -> Handle<T>;
fn take_right(&mut self) -> Handle<T>;
}
impl<T> HandleFunctions<T> for Handle<T> {
fn recursive_left(&self) -> &Handle<T> {
match self.as_ref() {
Some(node) if node.left.is_some() => node.left.recursive_left(),
_ => self,
}
}
fn recursive_right(&self) -> &Handle<T> {
match self.as_ref() {
Some(node) if node.right.is_some() => node.right.recursive_right(),
_ => self
}
}
fn take_left(&mut self) -> Handle<T> {
self.as_mut().map_or(None, |node| node.left.take())
}
fn take_right(&mut self) -> Handle<T> {
self.as_mut().map_or(None, |node| node.right.take())
}
}
trait OptionHandleFunctions<T> {
fn nil(&self) -> bool;
fn level(&self) -> Option<i32>;
fn value(&self) -> Option<T>;
fn left(&mut self) -> Option<&mut Handle<T>>;
fn right(&mut self) -> Option<&mut Handle<T>>;
fn node<F>(&self, f: F) where F: FnOnce(&Node<T>);
fn node_mut<F>(&mut self, f: F) where F: FnOnce(&mut Node<T>);
}
impl<T: Clone> OptionHandleFunctions<T> for Handle<T> {
fn nil(&self) -> bool {self.is_none()}
fn level(&self) -> Option<i32> {self.as_ref().map(|node| node.level)}
fn value(&self) -> Option<T> {self.as_ref().map(|node| node.value.clone())}
fn left(&mut self) -> Option<&mut Handle<T>> {self.as_mut().map(|node| &mut node.left)}
fn right(&mut self) -> Option<&mut Handle<T>> {self.as_mut().map(|node| &mut node.right)}
fn node<F>(&self, f: F) where F: FnOnce(&Node<T>) {
if let Some(node) = self.as_ref() {f(node)}
}
fn node_mut<F>(&mut self, f: F) where F: FnOnce(&mut Node<T>) {
if let Some(node) = self.as_mut() {f(node)}
}
}
impl<'a, T: Clone> OptionHandleFunctions<T> for Option<&'a mut Handle<T>> {
fn nil(&self) -> bool {self.as_ref().map_or(true, |h| h.nil())}
fn level(&self) -> Option<i32> {self.as_ref().map_or(None, |h| h.level())}
fn value(&self) -> Option<T> {self.as_ref().map_or(None, |h| h.value())}
fn left(&mut self) -> Option<&mut Handle<T>> {self.as_mut().map_or(None, |h| h.left())}
fn right(&mut self) -> Option<&mut Handle<T>> {self.as_mut().map_or(None, |h| h.right())}
fn node<F>(&self, f: F) where F: FnOnce(&Node<T>) {if let Some(h) = self.as_ref() {h.node(f)}}
fn node_mut<F>(&mut self, f: F) where F: FnOnce(&mut Node<T>) {if let Some(h) = self.as_mut() {h.node_mut(f)}}
}
#[derive(Debug)]
struct Tree<T> {
root: Handle<T>,
}
impl<T: PartialEq + PartialOrd + Clone + fmt::Debug> Tree<T> {
fn new() -> Tree<T> {Tree {root: None}}
fn add(&mut self, value: T) {self.root = Tree::insert(self.root.take(), value)}
fn
remove(&mut self
, value
: T
) {self.
root = Tree
::delete(self.
root.
take(), value
)} fn insert(mut h: Handle<T>, value: T) -> Handle<T> {
match h.as_mut() {
None => return Node::handle(value),
Some(node) => {
if value < node.value {
node.left = Tree::insert(node.left.take(), value);
} else if node.value < value {
node.right = Tree::insert(node.right.take(), value);
}
},
}
Tree::split(Tree::skew(h))
}
fn delete(mut h: Handle<T>, value: T) -> Handle<T> {
if h.nil() {return h}
if let Some(node) = h.as_mut() {
if node.value < value {
node.right = Tree::delete(node.right.take(), value);
} else if value < node.value {
node.left = Tree::delete(node.left.take(), value);
} else {
if node.left.nil() && node.right.nil() {
return None;
} else if node.left.nil() {
if let Some(successor_value) = node.right.recursive_left().value() {
node.right = Tree::delete(node.right.take(), successor_value.clone());
node.value = successor_value;
}
} else {
if let Some(predecessor_value) = node.left.recursive_right().value() {
node.left = Tree::delete(node.left.take(), predecessor_value.clone());
node.value = predecessor_value;
}
}
}
}
h = Tree::skew(Tree::decrease_level(h));
h.node_mut(|n| n.right = Tree::skew(n.right.take()));
h.right().node_mut(|n| n.right = Tree::skew(n.right.take()));
h = Tree::split(h);
h.node_mut(|n| n.right = Tree::split(n.right.take()));
h
}
fn skew(mut h: Handle<T>) -> Handle<T> {
if h.nil() {
None
} else if h.left().nil() {
h
} else if h.left().level() == h.level() {
let mut l = h.take_left();
h.node_mut(|n| n.left = l.take_right());
l.node_mut(|n| n.right = h);
l
} else {
h
}
}
fn split(mut h: Handle<T>) -> Handle<T> {
if h.nil() {
None
} else if h.right().nil() || h.right().right().nil() {
h
} else if h.level() == h.right().right().level() {
let mut r = h.take_right();
h.node_mut(|n| n.right = r.take_left());
r.node_mut(|n| n.left = h);
r.node_mut(|n| n.level += 1);
r
} else {
h
}
}
fn decrease_level(mut h: Handle<T>) -> Handle<T> {
let should_be = std::cmp::min(h.left().level(), h.right().level()).unwrap_or(1) + 1;
if Some(should_be) < h.level() {
h.node_mut(|n| n.level = should_be);
if Some(should_be) < h.right().level() {
h.right().node_mut(|n| n.level = should_be);
}
}
h
}
}
#[derive(PartialOrd, PartialEq, Clone)]
struct Huge {name: &'static str,} // '
impl Huge {fn new(name: &'static str) -> Huge {Huge {name: name}}} // '
impl Drop for Huge {fn drop(&mut self) {println!("> Dropping {}", self.name)}}
impl fmt::Debug for Huge {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {write!(f, "{:?}", self.name)}
}
#[derive(Debug)]
struct TreeAua<T> { // avoid unnecessary allocations.
root: Handle<Rc<T>>,
}
impl<T: PartialEq + PartialOrd + Clone + fmt::Debug> TreeAua<T> {
fn new() -> TreeAua<T> {TreeAua {root: None}}
fn add(&mut self, value: T) {self.root = Tree::insert(self.root.take(), Rc::new(value))}
fn
remove(&mut self
, value
: T
) {self.
root = Tree
::delete(self.
root.
take(), Rc
::new(value
))}}
fn main() {
let mut tree = TreeAua::new();
println!("{:?}", &tree);
tree.add(100);
println!("{:?}", &tree);
tree.add(200);
println!("{:?}", &tree);
tree.add(50);
println!("{:?}", &tree);
tree.add(300);
println!("{:?}", &tree);
println!("--");
println!("{:?}", &tree);
tree.add(400);
println!("{:?}", &tree);
{
println!("--");
let mut a = Tree::new();
a.add(Huge::new("A"));
a.add(Huge::new("B"));
a.add(Huge::new("C"));
println!("{:?}", &a);
}
{
println!("--");
let mut a = TreeAua::new();
a.add(Huge::new("A"));
a.add(Huge::new("B"));
a.add(Huge::new("C"));
println!("{:?}", &a);
}
{
println!("--");
let mut a = Tree::new();
a.add(Rc::new(Huge::new("A")));
let b = Rc::new(Huge::new("B"));
a.add(b.clone());
a.add(Rc::new(Huge::new("C")));
println!("{:?}", &a);
}
}