use std::rc::Rc;
use std::cell::RefCell;
use std::fmt;
type Handle<T> = Rc<RefCell<Option<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: Node::none(), right: Node::none()}}
fn _handle(op: Option<Node<T>>) -> Handle<T> {Rc::new(RefCell::new(op))}
fn none() -> Handle<T> {Node::_handle(None)}
fn handle(value: T) -> Handle<T> {Node::_handle(Some(Node::new(value)))}
fn clone_left(&self) -> Handle<T> {Rc::clone(&self.left)}
fn clone_right(&self) -> Handle<T> {Rc::clone(&self.right)}
}
impl<T: fmt::Debug> fmt::Debug for Node<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if let Some(l) = self.left.borrow().as_ref() {
if let Some(r) = self.right.borrow().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.borrow().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 to_op(&self) -> Option<Handle<T>>;
}
impl<T: Copy> HandleFunctions<T> for Handle<T> {
fn recursive_left(&self) -> Handle<T> {
match self.borrow().as_ref() {
Some(node) if !node.left.nil() => node.left.recursive_left(),
_ => Rc::clone(self),
}
}
fn recursive_right(&self) -> Handle<T> {
match self.borrow().as_ref() {
Some(node) if !node.right.nil() => node.right.recursive_right(),
_ => Rc::clone(self),
}
}
fn to_op(&self) -> Option<Handle<T>> {Some(Rc::clone(self))}
}
trait OptionHandleFunctions<T> {
fn nil(&self) -> bool;
fn level(&self) -> Option<i32>;
fn value(&self) -> Option<T>;
fn left(&self) -> Option<Handle<T>>;
fn right(&self) -> Option<Handle<T>>;
fn set_left(&self, op: Option<Handle<T>>);
fn set_right(&self, op: Option<Handle<T>>);
fn node<F>(&self, f: F) where F: Fn(&Node<T>);
fn node_mut<F>(&self, f: F) where F: Fn(&mut Node<T>);
}
impl<T: Copy> OptionHandleFunctions<T> for Handle<T> {
fn nil(&self) -> bool {self.borrow().is_none()}
fn level(&self) -> Option<i32> {self.borrow().as_ref().map(|node| node.level)}
fn value(&self) -> Option<T> {self.borrow().as_ref().map(|node| node.value)}
fn left(&self) -> Option<Handle<T>> {self.borrow().as_ref().map(|node| node.clone_left())}
fn right(&self) -> Option<Handle<T>> {self.borrow().as_ref().map(|node| node.clone_right())}
fn set_left(&self, op: Option<Handle<T>>) {
if let Some(h) = op {self.node_mut (|n| n.left = Rc::clone(&h))}
}
fn set_right(&self, op: Option<Handle<T>>) {
if let Some(h) = op {self.node_mut (|n| n.right = Rc::clone(&h))}
}
fn node<F>(&self, f: F) where F: Fn(&Node<T>) {
if let Some(node) = self.borrow().as_ref() {f(node)}
}
fn node_mut<F>(&self, f: F) where F: Fn(&mut Node<T>) {
if let Some(node) = self.borrow_mut().as_mut() {f(node)}
}
}
impl<T: Copy> OptionHandleFunctions<T> for Option<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(&self) -> Option<Handle<T>> {self.as_ref().map_or(None, |h| h.left())}
fn right(&self) -> Option<Handle<T>> {self.as_ref().map_or(None, |h| h.right())}
fn set_left(&self, op: Option<Handle<T>>) {if let Some(h) = self.as_ref() {h.set_left(op)}}
fn set_right(&self, op: Option<Handle<T>>) {if let Some(h) = self.as_ref() {h.set_right(op)}}
fn node<F>(&self, f: F) where F: Fn(&Node<T>) {if let Some(h) = self.as_ref() {h.node(f)}}
fn node_mut<F>(&self, f: F) where F: Fn(&mut Node<T>) {if let Some(h) = self.as_ref() {h.node_mut(f)}}
}
#[derive(Debug)]
struct Tree<T> {
root: Handle<T>,
}
impl<T: PartialEq + PartialOrd + Copy + fmt::Debug> Tree<T> {
fn new() -> Tree<T> {Tree {root: Node::none()}}
fn add(&mut self, value: T) {self.root = Tree::insert(Rc::clone(&self.root), value)}
fn
remove(&mut self
, value
: T
) {self.
root = Tree
::delete(Rc
::clone(&self.
root), value
)} fn insert(h: Handle<T>, value: T) -> Handle<T> {
match h.borrow_mut().as_mut() {
None => return Node::handle(value),
Some(node) => {
if value < node.value {
node.left = Tree::insert(node.clone_left(), value);
} else if node.value < value {
node.right = Tree::insert(node.clone_right(), 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.borrow_mut().as_mut() {
if node.value < value {
node.right = Tree::delete(node.clone_right(), value);
} else if value < node.value {
node.left = Tree::delete(node.clone_left(), value);
} else {
if node.left.nil() && node.right.nil() {
return Node::none();
} else if node.left.nil() {
if let Some(successor_value) = node.right.recursive_left().value() {
node.right = Tree::delete(node.clone_right(), successor_value);
node.value = successor_value;
}
} else {
if let Some(predecessor_value) = node.left.recursive_right().value() {
node.left = Tree::delete(node.clone_left(), predecessor_value);
node.value = predecessor_value;
}
}
}
}
h = Tree::skew(Tree::decrease_level(h));
h.node_mut(|n| n.right = Tree::skew(n.clone_right()));
h.right().node_mut(|n| n.right = Tree::skew(n.clone_right()));
h = Tree::split(h);
h.node_mut(|n| n.right = Tree::split(n.clone_right()));
h
}
fn skew(h: Handle<T>) -> Handle<T> {
if h.nil() {
Node::none()
} else if h.left().nil() {
h
} else if h.left().level() == h.level() {
let l = h.left();
h.set_left(l.right());
l.set_right(h.to_op());
l.unwrap_or(h)
} else {
h
}
}
fn split(h: Handle<T>) -> Handle<T> {
if h.nil() {
Node::none()
} else if h.right().nil() || h.right().right().nil() {
h
} else if h.level() == h.right().right().level() {
let r = h.right();
h.set_right(r.left());
r.set_left(h.to_op());
r.node_mut(|n| n.level += 1);
r.unwrap_or(h)
} else {
h
}
}
fn decrease_level(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
}
}
fn main() {
let mut tree = Tree::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);
}