use std::fmt;
use std::marker::Sync;
use rand::seq::SliceRandom;
use rand::rngs::ThreadRng;
use rand::Rng;
pub mod node;
pub mod iterators;
pub use node::{Node, Link};
#[derive(PartialEq)]
pub struct Tree<T: Clone> {
root: Link<T>,
size: i32,
}
impl<T: Clone> Tree<T> {
pub fn new() -> Self {
Tree {
root: None,
size: 0,
}
}
pub fn from_slice(nodes: &mut [Option<T>]) -> Self {
let mut tree = Self::new();
tree.size = nodes.len() as i32;
tree.set_root(tree.make_tree(nodes));
tree
}
pub(crate) fn root_mut_opt(&mut self) -> Option<&mut Node<T>> {
self.root.as_mut().map(|n| n.as_mut())
}
pub(crate) fn root_opt(&self) -> Option<&Node<T>> {
self.root.as_ref().map(|n| n.as_ref())
}
pub(crate) fn set_root(&mut self, root: Link<T>) {
self.drop_root();
self.root = root;
}
fn drop_root(&mut self) {
self.root = None;
}
pub fn iter_mut(&mut self) -> iterators::IterMut<'_, T> {
iterators::IterMut::new(self.root_mut_opt())
}
pub fn level_order_iter(&self) -> iterators::LevelOrderIterator<'_, T> {
iterators::LevelOrderIterator::new(self.root_opt())
}
pub fn in_order_iter(&self) -> iterators::InOrderIterator<'_, T> {
iterators::InOrderIterator::new(self.root_opt())
}
pub fn len(&self) -> usize {
self.size as usize
}
pub fn update_size(&mut self) {
self.size = match self.root_opt() {
Some(root) => root.size(),
None => 0,
};
}
#[inline]
pub fn height(&self) -> i32 {
match self.root_opt() {
Some(root) => root.height(),
None => 0,
}
}
#[inline]
pub fn get(&self, index: usize) -> Option<&T> {
self.in_order_iter().nth(index).map(|n| n.get())
}
#[inline]
pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
self.get_node_mut(index).map(|n| n.get_mut())
}
#[inline]
pub fn get_node_mut(&mut self, index: usize) -> Option<&mut Node<T>> {
self.iter_mut().nth(index)
}
#[inline]
pub fn index_of(&self, node: &Node<T>) -> usize {
let mut temp: Option<usize> = None;
for (index, curr) in self.in_order_iter().enumerate() {
if curr == node {
temp = Some(index);
break;
}
}
temp.unwrap_or_else(|| panic!("Node index not found."))
}
pub fn insert_random(&mut self, elem: T) {
let node = Node::new(elem);
match self.root_mut_opt() {
Some(root) => {
root.insert_random(node);
},
None => {
self.set_root(Some(node));
},
}
self.size += 1;
}
pub fn display(&self) {
match &self.root {
None => panic!("The no root node"),
Some(root) => root.display(0),
}
}
pub fn balance(&mut self) {
let mut node_bag = self.in_order_iter()
.map(|x: &Node<T>| Some(x.get().clone()))
.collect::<Vec<_>>();
self.set_root(self.make_tree(&mut node_bag[..]));
}
#[inline]
fn make_tree(&self, bag: &mut [Option<T>]) -> Link<T> {
let midpoint = bag.len() / 2;
let (left, right) = bag.split_at_mut(midpoint);
if let Some((node, right)) = right.split_first_mut() {
let mut curr_node = Node::new(node.take().unwrap());
curr_node.set_left_child(self.make_tree(left));
curr_node.set_right_child(self.make_tree(right));
Some(curr_node)
} else {
return None;
}
}
#[inline]
pub fn get_biased_level<'a>(&'a self) -> Vec<&'a Node<T>> {
let mut r = rand::thread_rng();
let height = self.height();
let index = r.gen_range(0, self.len()) as usize;
let levels = self.level_order_iter()
.map(|x: &Node<T>| height - x.height())
.collect::<Vec<_>>();
self.in_order_iter()
.filter(|x| x.depth() == levels[index])
.collect::<Vec<_>>()
}
pub fn get_biased_random_node<'a>(&'a self) -> &'a Node<T> {
let mut nodes = self.get_biased_level();
let index = rand::thread_rng().gen_range(0, nodes.len());
nodes.remove(index)
}
pub(crate) fn replace(&mut self, swap_index: usize, mut other_node: Box<Node<T>>) {
let swap_node = self.get_node_mut(swap_index)
.expect("Index not found in tree.");
match swap_node.is_left_child() {
Some(true) => {
if let Some(parent) = swap_node.parent_mut_opt() {
parent.set_left_child(Some(other_node));
}
},
Some(false) => {
if let Some(parent) = swap_node.parent_mut_opt() {
parent.set_right_child(Some(other_node));
}
},
None => {
other_node.remove_from_parent();
self.set_root(Some(other_node));
}
};
self.update_size();
}
#[inline]
pub fn shuffle_tree(&mut self, r: &mut ThreadRng) {
let mut node_list = self.in_order_iter()
.map(|x: &Node<T>| Some(x.get().clone()))
.collect::<Vec<_>>();
node_list.shuffle(r);
self.set_root(self.make_tree(&mut node_list[..]));
}
}
impl<T: Clone> fmt::Debug for Tree<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Tree=[{}]", self.size)
}
}
impl<T: Clone> Clone for Tree<T> {
#[inline]
fn clone(&self) -> Self {
let root = self.root_opt().map(|n| n.deepcopy());
Tree {
root,
size: self.size,
}
}
}
impl<T: Clone> Drop for Tree<T> {
fn drop(&mut self) {
self.drop_root();
}
}
unsafe impl<T: Clone> Send for Tree<T> {}
unsafe impl<T: Clone> Sync for Tree<T> {}
impl<T: Clone> Default for Tree<T> {
fn default() -> Self {
Tree {
root: None,
size: 0
}
}
}