Skip to main content

RBTree

Struct RBTree 

Source
pub struct RBTree<K: Ord + Copy, A: Copy, V>(/* private fields */);
Expand description

A left-leaning red–black (LLRB) Tree, optimized for safety, simplicity of implementation, and augmentation. This tree is mimicking the behavior of a 2-3 tree. Full desciption of the tree design and complexity analysis is available in the paper titled Left-leaning Red-Black Trees by Robert Sedgewick. If you just need a normal non-augmentable tree-baesed map check std::collections::BTreeMap instead.

Implementations§

Source§

impl<K: Ord + Copy, A: Copy, V> RBTree<K, A, V>
where RBTree<K, A, V>: Augment<A>,

Source

pub fn is_node(&self) -> bool

Return True if the current node is not null node.

Source

pub fn key(&self) -> K

Returns copy of key of the current Tree node

§Panics

panics if current subtree is not a node

Source

pub fn set_aug_data(&mut self, aug_data: A)

Changes the aug_data stored in the current Tree node.

§Panics

panics if current subtree is not a node.

Source

pub fn aug_data(&self) -> A

Returns aug_data stored in the current Tree node.

§Panics

panics if current subtree is not a node

Source

pub fn set_data(&mut self, data: V)

Changes the data stored in the current Tree node.

§Panics

panics if current subtree is not a node.

Source

pub fn data(self) -> V

Returns data stored in the current Tree node.

§Panics

panics if current subtree is not a node

Source

pub fn mut_me(&mut self) -> LeftRightDataTuple<'_, K, A, V>

Returns a tuple of tree elements: a mutable reference to left node, mutable right node and mutable referent to the value stored inside the current node. The reason such functionality might be desired, is when user wants to keep mutual reference of at least any 2 of either left node, right node or data. left_mut(), right_mut() and data_mut() will not work because rust does not support partial borrowing yet.

Source

pub fn data_ref(&self) -> &V

Returns non-mutable reference to data stored in the current Tree node

§Panics

panics if current subtree is not a node

Source

pub fn data_mut(&mut self) -> &mut V

Returns mutable reference to data stored in the current Tree node

§Panics

panics if current subtree is not a node

Source

pub fn set_left(&mut self, subtree: RBTree<K, A, V>)

Set the left subtree of the current Node.

§Panics

panics if current subtree is not a node.

Source

pub fn left(&mut self) -> RBTree<K, A, V>

Returns the left subtree after ripping it from the current node.

§Panics

panics if current subtree is not a node

Source

pub fn left_ref(&self) -> &RBTree<K, A, V>

Returns a non-mutable reference to left subtree.

§Panics

panics if current subtree is not a node

Source

pub fn left_mut(&mut self) -> &mut RBTree<K, A, V>

Returns a mutable reference to left subtree.

§Panics

panics if current subtree is not a node

Source

pub fn set_right(&mut self, subtree: RBTree<K, A, V>)

Set the right subtree of the current Node.

§Panics

panics if current subtree is not a node.

Source

pub fn right(&mut self) -> RBTree<K, A, V>

Returns the right subtree after ripping it from the current node.

§Panics

panics if current subtree is not a node

Source

pub fn right_ref(&self) -> &RBTree<K, A, V>

Returns a non-mutable reference to right subtree.

§Panics

panics if current subtree is not a node

Source

pub fn right_mut(&mut self) -> &mut RBTree<K, A, V>

Returns a mutable reference to right subtree.

§Panics

panics if current subtree is not a node

Source

pub fn new() -> RBTree<K, A, V>

Returns new Red Black Tree

§Example
use rtrees::rbtree::*;
#[derive(Copy, Clone)]
struct PlaceHolder();
impl Augment<PlaceHolder> for RBTree<u64, PlaceHolder, &'static str> {}
type Tree = RBTree<u64, PlaceHolder,  &'static str>;
let my_tree = Tree::new();
Source

pub fn size(&self) -> u64

Returns the number of elements in the tree

§Example
use rtrees::rbtree::*;
#[derive(Copy, Clone)]
struct PlaceHolder();
impl Augment<PlaceHolder> for RBTree<u64, PlaceHolder, &'static str> {}
type Tree = RBTree<u64, PlaceHolder,  &'static str>;
let mut rbtree = Tree::new();
assert_eq!(rbtree.size(), 0);
rbtree.insert(0, PlaceHolder(), "Zero");
assert_eq!(rbtree.size(), 1);
rbtree.insert(1, PlaceHolder(), "One");
assert_eq!(rbtree.size(), 2);
rbtree.insert(2, PlaceHolder(), "Two");
assert_eq!(rbtree.size(), 3);
Source

pub fn get_level(&self) -> u64

0 will be returned in case of empty tree. If tree has nodes, then get_level returns 1 + the number of connections between root and the farthest node from it.

§Example
use rtrees::rbtree::*;
#[derive(Copy, Clone)]
struct PlaceHolder();
impl Augment<PlaceHolder> for RBTree<u64, PlaceHolder, &'static str> {}
type Tree = RBTree<u64, PlaceHolder,  &'static str>;
let mut rbtree = Tree::new();
assert_eq!(rbtree.get_level(), 0);
for i in 0..1024 {
    rbtree.insert(i, PlaceHolder(), "Random Value");
}
assert!(rbtree.get_level() >= 10 && rbtree.get_level() <= 20);
Source

pub fn delete_min(&mut self) -> Option<V>

Deletes the minimum value in the tree and returns the data stored in that node.

§Example
use rtrees::rbtree::*;
#[derive(Copy, Clone)]
struct PlaceHolder();
impl Augment<PlaceHolder> for RBTree<u64, PlaceHolder, &'static str> {}
type Tree = RBTree<u64, PlaceHolder,  &'static str>;
let mut rbtree = RBTree::new();
rbtree.insert(0, PlaceHolder(), "First Insertion");
rbtree.insert(5, PlaceHolder(), "Second Insertion");
rbtree.insert(10, PlaceHolder(), "Third Insertion");
assert_eq!(rbtree.delete_min().unwrap(), "First Insertion");
assert_eq!(rbtree.delete_min().unwrap(), "Second Insertion");
assert_eq!(rbtree.delete_min().unwrap(), "Third Insertion");
assert_eq!(rbtree.delete_min(), None);
Source

pub fn insert(&mut self, key: K, aug_data: A, data: V)

Inserts data associated with key into tree. insert does not support duplicated key. In case of inserting into an already existing key, the old data will silently be repalced by the new data.

§Example
use rtrees::rbtree::*;
#[derive(Copy, Clone)]
struct PlaceHolder();
impl Augment<PlaceHolder> for RBTree<u64, PlaceHolder, u64> {}
type Tree = RBTree<u64, PlaceHolder, u64>;
let mut rbtree = Tree::new();
rbtree.insert(0, PlaceHolder(), 0);
rbtree.insert(1, PlaceHolder(), 1);
rbtree.insert(2, PlaceHolder(), 2);
assert_eq!(rbtree.search(0).unwrap(), &0);
assert_eq!(rbtree.search(1).unwrap(), &1);
assert_eq!(rbtree.search(2).unwrap(), &2);
Source

pub fn force_sync_aug(&mut self, key: K)

Force recalculating all agumented data from node matching key up to the root node.

Source

pub fn search(&self, key: K) -> Option<&V>

Returns a non mutable references of the data stored at key #example

use rtrees::rbtree::*;
#[derive(Copy, Clone)]
struct PlaceHolder();
impl Augment<PlaceHolder> for RBTree<u64, PlaceHolder, &'static str> {}
type Tree = RBTree<u64, PlaceHolder,  &'static str>;
let mut rbtree = Tree::new();
rbtree.insert(0, PlaceHolder(), "First Insertion");
rbtree.insert(5, PlaceHolder(), "Second Insertion");
assert_eq!(rbtree.search(0).unwrap(), &"First Insertion");
assert_eq!(rbtree.search(5).unwrap(), &"Second Insertion");
assert_eq!(rbtree.search(21), None);
Source

pub fn search_mut(&mut self, key: K) -> Option<&mut V>

Returns a mutable references of the data stored at key. We assume that in mutable search caller might modify augmented data, #example

use rtrees::rbtree::*;
#[derive(Copy, Clone)]
struct PlaceHolder();
impl Augment<PlaceHolder> for RBTree<u64, PlaceHolder, String> {}
type Tree = RBTree<u64, PlaceHolder,  String>;
let mut rbtree = RBTree::new();
rbtree.insert(0, PlaceHolder(), String::from("First Insertion"));
rbtree.search_mut(0).unwrap().push_str(" Modified");
assert_eq!(rbtree.search(0).unwrap(), &"First Insertion Modified");
Source

pub fn delete(&mut self, key: K) -> Option<V>

Deletes tree node represented by key. The return value is data stored there.

§Example
use rtrees::rbtree::*;
#[derive(Copy, Clone)]
struct PlaceHolder();
impl Augment<PlaceHolder> for RBTree<u64, PlaceHolder, &'static str> {}
type Tree = RBTree<u64, PlaceHolder,  &'static str>;
let mut rbtree = Tree::new();
rbtree.insert(10, PlaceHolder(), "First Insertion");
rbtree.insert(15, PlaceHolder(), "Second Insertion");
assert_eq!(rbtree.delete(10).unwrap(), "First Insertion");
assert_eq!(rbtree.delete(15).unwrap(), "Second Insertion");

Trait Implementations§

Source§

impl<K: Default + Ord + Copy, A: Default + Copy, V: Default> Default for RBTree<K, A, V>

Source§

fn default() -> RBTree<K, A, V>

Returns the “default value” for a type. Read more
Source§

impl<'a, K: Ord + Copy, A: Copy, V> IntoIterator for &'a RBTree<K, A, V>
where RBTree<K, A, V>: Augment<A>,

Source§

type Item = (K, A, &'a V)

The type of the elements being iterated over.
Source§

type IntoIter = TreeRefIterator<'a, K, A, V>

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> TreeRefIterator<'a, K, A, V>

Creates an iterator from a value. Read more
Source§

impl<K: Ord + Copy, A: Copy, V> IntoIterator for RBTree<K, A, V>
where RBTree<K, A, V>: Augment<A>,

Source§

type Item = (K, A, V)

The type of the elements being iterated over.
Source§

type IntoIter = TreeIterator<K, A, V>

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> TreeIterator<K, A, V>

Creates an iterator from a value. Read more

Auto Trait Implementations§

§

impl<K, A, V> Freeze for RBTree<K, A, V>

§

impl<K, A, V> RefUnwindSafe for RBTree<K, A, V>

§

impl<K, A, V> Send for RBTree<K, A, V>
where K: Send, A: Send, V: Send,

§

impl<K, A, V> Sync for RBTree<K, A, V>
where K: Sync, A: Sync, V: Sync,

§

impl<K, A, V> Unpin for RBTree<K, A, V>

§

impl<K, A, V> UnsafeUnpin for RBTree<K, A, V>

§

impl<K, A, V> UnwindSafe for RBTree<K, A, V>
where K: UnwindSafe, A: UnwindSafe, V: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.