use std::fmt;
use std::cmp::{ Ordering, PartialEq };
use std::iter::{ FromIterator, Extend };
use std::collections::VecDeque;
#[derive(Debug)]
pub struct BinarySearchTree<T: Ord> {
root: Tree<T>,
pub size: usize,
}
#[derive(Debug)]
struct Node<T: Ord> {
value: T,
left: Tree<T>,
right: Tree<T>,
}
#[derive(Debug)]
struct Tree<T: Ord>(Option<Box<Node<T>>>);
impl<T: Ord> PartialEq for BinarySearchTree<T> {
fn eq(&self, other: &BinarySearchTree<T>) -> bool {
self.sorted_vec() == other.sorted_vec()
}
}
impl<T: Ord + fmt::Debug> fmt::Display for BinarySearchTree<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", self.sorted_vec())
}
}
impl<T: Ord> Extend<T> for BinarySearchTree<T> {
fn extend<I: IntoIterator<Item=T>>(&mut self, iter: I) {
iter.into_iter().for_each(move |elem| {
self.insert(elem);
});
}
}
impl<T: Ord> FromIterator<T> for BinarySearchTree<T> {
fn from_iter<I: IntoIterator<Item=T>>(iter: I) -> Self {
let mut tree = BinarySearchTree::new();
tree.extend(iter);
tree
}
}
impl<T: Ord + Clone> Clone for BinarySearchTree<T> {
fn clone(&self) -> BinarySearchTree<T> {
let mut new_tree = BinarySearchTree::new();
for elem in self.sorted_vec().iter() {
new_tree.insert((*elem).clone());
}
new_tree
}
}
impl<T: Ord> BinarySearchTree<T> {
pub fn new() -> Self {
BinarySearchTree { root: Tree(None), size: 0 }
}
pub fn is_empty(&self) -> bool {
self.size == 0
}
pub fn len(&self) -> usize {
self.size
}
pub fn clear(&mut self) {
*self = BinarySearchTree::new();
}
pub fn root(&self) -> Option<&T> {
self.root.0.as_ref().map(|node| &node.value)
}
pub fn insert(&mut self, value: T) -> bool {
self.size += 1;
self.root.insert(value, true)
}
pub fn insert_without_dup(&mut self, value: T) -> bool {
let res = self.root.insert(value, false);
if !res {
self.size += 1;
}
res
}
pub fn contains(&self, target: &T) -> bool {
self.root.contains(target)
}
pub fn min(&self) -> Option<&T> {
self.root.min()
}
pub fn max(&self) -> Option<&T> {
self.root.max()
}
pub fn successor(&self, val: &T) -> Option<&T> {
self.root.successor(val)
}
pub fn predecessor(&self, val: &T) -> Option<&T> {
self.root.predecessor(val)
}
pub fn extract_min(&mut self) -> Option<T> {
let res = self.root.extract_min();
if res.is_some() {
self.size -= 1;
}
res
}
pub fn extract_max(&mut self) -> Option<T> {
let res = self.root.extract_max();
if res.is_some() {
self.size -= 1;
}
res
}
pub fn remove(&mut self, target: &T) -> bool {
let res = self.root.remove(target);
if res {
self.size -= 1;
}
res
}
pub fn sorted_vec(&self) -> Vec<&T> {
self.root.sorted_vec()
}
pub fn into_sorted_vec(self) -> Vec<T> {
self.root.into_sorted_vec()
}
pub fn inorder(&self) -> InorderTraversal<T> {
InorderTraversal {
stack: Vec::new(),
current: self.root.0.as_ref(),
}
}
pub fn reverse_order(&self) -> ReverseOrderTraversal<T> {
ReverseOrderTraversal {
stack: Vec::new(),
current: self.root.0.as_ref(),
}
}
pub fn preorder(&self) -> PreorderTraversal<T> {
PreorderTraversal {
stack: vec![self.root.0.as_ref()],
current: self.root.0.as_ref(),
}
}
pub fn postorder(&self) -> PostorderTraversal<T> {
PostorderTraversal {
stack: Vec::new(),
current: self.root.0.as_ref(),
}
}
pub fn level_order(&self) -> LevelOrderTraversal<T> {
let mut deque = VecDeque::new();
if let Some(root) = self.root.0.as_ref() {
deque.push_back(root);
}
LevelOrderTraversal { deque: deque }
}
}
impl<T: Ord> Node<T> {
pub fn new(value: T) -> Self {
Node {
value: value,
left: Tree(None),
right: Tree(None),
}
}
}
impl<T: Ord> Tree<T> {
pub fn insert(&mut self, value: T, allow_duplicate: bool) -> bool {
let mut current = self;
let mut is_duplicate = false;
while let Some(ref mut node) = current.0 {
match node.value.cmp(&value) {
Ordering::Greater => current = &mut node.left,
Ordering::Less => current = &mut node.right,
Ordering::Equal => {
if allow_duplicate {
is_duplicate = true;
current = &mut node.right;
} else {
return true;
}
}
}
}
current.0 = Some(Box::new(Node::new(value)));
is_duplicate
}
pub fn contains(&self, target: &T) -> bool {
let mut current = self;
while let Some(ref node) = current.0 {
match node.value.cmp(target) {
Ordering::Greater => current = &node.left,
Ordering::Less => current = &node.right,
Ordering::Equal => return true,
}
}
false
}
pub fn min(&self) -> Option<&T> {
if self.0.is_some() {
let mut current = self.0.as_ref();
let mut left = current.unwrap().left.0.as_ref();
while let Some(node) = left {
current = left;
left = node.left.0.as_ref();
}
current.map(|node| &node.value)
} else {
None
}
}
pub fn max(&self) -> Option<&T> {
if self.0.is_some() {
let mut current = self.0.as_ref();
let mut right = current.unwrap().right.0.as_ref();
while let Some(node) = right {
current = right;
right = node.right.0.as_ref();
}
current.map(|node| &node.value)
} else {
None
}
}
pub fn successor(&self, val: &T) -> Option<&T> {
let mut current = self.0.as_ref();
let mut successor = None;
while current.is_some() {
let node = current.unwrap();
if node.value > *val {
successor = current;
current = node.left.0.as_ref();
} else {
current = node.right.0.as_ref();
}
}
successor.map(|node| &node.value)
}
pub fn predecessor(&self, val: &T) -> Option<&T> {
let mut current = self.0.as_ref();
let mut predecessor = None;
while current.is_some() {
let node = current.unwrap();
if node.value < *val {
predecessor = current;
current = node.right.0.as_ref();
} else {
current = node.left.0.as_ref();
}
}
predecessor.map(|node| &node.value)
}
pub fn extract_min(&mut self) -> Option<T> {
let mut to_return = None;
if self.0.is_some() {
let mut current = self;
while current.0.as_ref().unwrap().left.0.is_some() {
current = &mut current.0.as_mut().unwrap().left;
}
let node = current.0.take().unwrap();
to_return = Some(node.value);
current.0 = node.right.0;
}
to_return
}
pub fn extract_max(&mut self) -> Option<T> {
let mut to_return = None;
if self.0.is_some() {
let mut current = self;
while current.0.as_ref().unwrap().right.0.is_some() {
current = &mut current.0.as_mut().unwrap().right;
}
let node = current.0.take().unwrap();
to_return = Some(node.value);
current.0 = node.left.0;
}
to_return
}
pub fn remove(&mut self, target: &T) -> bool {
let mut current: *mut Tree<T> = self;
unsafe {
while let Some(ref mut node) = (*current).0 {
match node.value.cmp(target) {
Ordering::Greater => {
current = &mut node.left;
},
Ordering::Less => {
current = &mut node.right;
},
Ordering::Equal => {
match (node.left.0.as_mut(), node.right.0.as_mut()) {
(None, None) => {
(*current).0 = None;
},
(Some(_), None) => {
(*current).0 = node.left.0.take();
},
(None, Some(_)) => {
(*current).0 = node.right.0.take();
},
(Some(_), Some(_)) => {
(*current).0.as_mut().unwrap().value = node.right.extract_min().unwrap();
}
}
return true; },
}
}
}
false }
pub fn sorted_vec(&self) -> Vec<&T> {
let mut elements = Vec::new();
if let Some(node) = self.0.as_ref() {
elements.extend(node.left.sorted_vec());
elements.push(&node.value);
elements.extend(node.right.sorted_vec());
}
elements
}
pub fn into_sorted_vec(self) -> Vec<T> {
let mut elements = Vec::new();
if let Some(node) = self.0 {
elements.extend(node.left.into_sorted_vec());
elements.push(node.value);
elements.extend(node.right.into_sorted_vec());
}
elements
}
}
pub struct InorderTraversal<'a, T: 'a + Ord> {
stack: Vec<Option<&'a Box<Node<T>>>>,
current: Option<&'a Box<Node<T>>>,
}
pub struct ReverseOrderTraversal<'a, T: 'a + Ord> {
stack: Vec<Option<&'a Box<Node<T>>>>,
current: Option<&'a Box<Node<T>>>,
}
pub struct PreorderTraversal<'a, T: 'a + Ord> {
stack: Vec<Option<&'a Box<Node<T>>>>,
current: Option<&'a Box<Node<T>>>,
}
pub struct PostorderTraversal<'a, T: 'a + Ord> {
stack: Vec<Option<&'a Box<Node<T>>>>,
current: Option<&'a Box<Node<T>>>,
}
pub struct LevelOrderTraversal<'a, T: 'a + Ord> {
deque: VecDeque<&'a Box<Node<T>>>,
}
impl<'a, T: 'a + Ord> Iterator for InorderTraversal<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<&'a T> {
loop {
if let Some(current) = self.current {
self.stack.push(self.current);
self.current = current.left.0.as_ref();
} else {
if let Some(node) = self.stack.pop() {
let current = node.unwrap();
let elem = ¤t.value;
self.current = current.right.0.as_ref();
return Some(elem);
} else {
return None;
}
}
}
}
}
impl<'a, T: 'a + Ord> Iterator for ReverseOrderTraversal<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<&'a T> {
loop {
if let Some(current) = self.current {
self.stack.push(self.current);
self.current = current.right.0.as_ref();
} else {
if let Some(node) = self.stack.pop() {
let current = node.unwrap();
let elem = ¤t.value;
self.current = current.left.0.as_ref();
return Some(elem);
} else {
return None;
}
}
}
}
}
impl<'a, T: 'a + Ord> Iterator for PreorderTraversal<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<&'a T> {
loop {
if let Some(current) = self.current {
let elem = ¤t.value;
self.current = current.left.0.as_ref();
self.stack.push(self.current);
return Some(elem);
} else {
if let Some(node) = self.stack.pop() {
if let Some(current) = node {
self.current = current.right.0.as_ref();
if self.current.is_some() {
self.stack.push(self.current);
}
}
} else {
return None;
}
}
}
}
}
impl<'a, T: 'a + Ord> Iterator for PostorderTraversal<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<&'a T> {
loop {
while let Some(current) = self.current {
if current.right.0.is_some() {
self.stack.push(current.right.0.as_ref());
}
self.stack.push(self.current);
self.current = current.left.0.as_ref();
}
if self.stack.len() == 0 {
return None;
}
if let Some(root) = self.stack.pop().unwrap() {
if self.stack.len() > 0 && root.right.0.is_some() &&
self.stack.get(self.stack.len()-1)
.unwrap().unwrap().value == root.right.0.as_ref().unwrap().value {
self.stack.pop(); self.stack.push(Some(root));
self.current = root.right.0.as_ref();
} else {
let elem = &root.value;
self.current = None;
return Some(elem);
}
} else {
return None; }
}
}
}
impl<'a, T: 'a + Ord> Iterator for LevelOrderTraversal<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<&'a T> {
if let Some(boxed_node) = self.deque.pop_front() {
if let Some(left) = boxed_node.left.0.as_ref() {
self.deque.push_back(left);
}
if let Some(right) = boxed_node.right.0.as_ref() {
self.deque.push_back(right);
}
Some(&boxed_node.value)
} else {
return None
}
}
}
#[cfg(test)]
mod test;