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>
impl<K: Ord + Copy, A: Copy, V> RBTree<K, A, V>
Sourcepub fn set_aug_data(&mut self, aug_data: A)
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.
Sourcepub fn mut_me(&mut self) -> LeftRightDataTuple<'_, K, A, V>
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.
Sourcepub fn data_ref(&self) -> &V
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
Sourcepub fn data_mut(&mut self) -> &mut V
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
Sourcepub fn left(&mut self) -> RBTree<K, A, V>
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
Sourcepub fn right(&mut self) -> RBTree<K, A, V>
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
Sourcepub fn new() -> RBTree<K, A, V>
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();Sourcepub fn size(&self) -> u64
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);Sourcepub fn get_level(&self) -> u64
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);Sourcepub fn delete_min(&mut self) -> Option<V>
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);Sourcepub fn insert(&mut self, key: K, aug_data: A, data: V)
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);Sourcepub fn force_sync_aug(&mut self, key: K)
pub fn force_sync_aug(&mut self, key: K)
Force recalculating all agumented data from node matching key up to the root node.
Sourcepub fn search(&self, key: K) -> Option<&V>
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);Sourcepub fn search_mut(&mut self, key: K) -> Option<&mut V>
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");Sourcepub fn delete(&mut self, key: K) -> Option<V>
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");