Skip to main content

treers/
lib.rs

1pub mod bst;
2pub mod btree;
3pub mod rbtree;
4
5pub trait SedgewickMap<K: Ord, V> {
6    fn new() -> Self;
7    fn size(&self) -> usize;
8    fn get(&self, key: &K) -> Option<&V>;
9    fn put(&mut self, key: K, value: V);
10    fn height(&self) -> Option<usize>;
11    fn is_empty(&self) -> bool {
12        self.size().eq(&0_usize)
13    }
14
15    /// Checks if key exists in `Tree`
16    ///
17    ///
18    /// # Examples
19    ///
20    /// Basic usage:
21    ///
22    /// ```
23    /// use treers::bst::BST;
24    /// use treers::SedgewickMap;
25    /// use treers::rbtree::RedBlackTree;
26    /// use treers::btree::BalancedTree;
27    ///
28    /// let mut bst: BST<char, u32> = BST::new();
29    /// let mut rbtree: RedBlackTree<char, u32> = RedBlackTree::new();
30    /// let mut btree: BalancedTree<char, u32> = BalancedTree::new();
31    ///
32    /// bst.put('a', 2);
33    /// rbtree.put('a', 2);
34    /// btree.put('a', 2);
35    ///
36    /// assert_eq!(bst.contains(&'a'), true);
37    /// assert_eq!(bst.contains(&'b'), false);
38    ///
39    /// assert_eq!(rbtree.contains(&'a'), true);
40    /// assert_eq!(rbtree.contains(&'b'), false);
41    ///
42    /// assert_eq!(btree.contains(&'a'), true);
43    /// assert_eq!(btree.contains(&'b'), false);
44    /// ```
45    fn contains(&self, key: &K) -> bool {
46        self.get(&key).is_some()
47    }
48    fn min(&self) -> Option<&K>;
49    fn max(&self) -> Option<&K>;
50}
51
52/// A immutable recursive traversals over Binary Trees.
53///
54/// `Pre order`
55/// `In order`
56/// `Post order`
57/// `Level order`
58///
59/// # Examples
60///
61/// Basic usage:
62///
63/// ```
64/// use treers::bst::BST;
65/// use treers::{SedgewickMap, Traversals, TreeTraversal};
66///
67/// let mut bst: BST<char, i32> = BST::new();
68/// bst.put('c', 3);
69/// bst.put('d', 4);
70/// bst.put('b', 2);
71/// bst.put('a', 1);
72///
73/// // Pre order Traversal by keys
74/// for (a, _) in bst.traverse(&Traversals::PreOrder) {
75///     print!("{}, ", *a);
76/// }
77///
78/// // In order Traversal by keys
79/// for (a, _) in bst.traverse(&Traversals::InOrder) {
80///     print!("{}, ", *a);
81/// }
82///
83/// // Post order Traversal by keys
84/// for (a, _) in bst.traverse(&Traversals::PostOrder) {
85///     print!("{}, ", *a);
86/// }
87///
88/// // Level order Traversal by keys
89/// for (a, _) in bst.traverse(&Traversals::LevelOrder) {
90///     print!("{}, ", *a);
91/// }
92/// ```
93pub trait TreeTraversal<K: Ord, V>: SedgewickMap<K, V> {
94    fn traverse(&self, traverse: &Traversals) -> std::vec::IntoIter<(&K, &V)> {
95        let mut vec = Vec::with_capacity(self.size());
96        match traverse {
97            Traversals::PreOrder => self.pre_order(&mut vec),
98            Traversals::InOrder => self.in_order(&mut vec),
99            Traversals::PostOrder => self.post_order(&mut vec),
100            Traversals::LevelOrder => {
101                for level in 0..=self.height().unwrap() {
102                    self.level_order(&mut vec, level);
103                }
104            }
105        }
106        vec.into_iter()
107    }
108    fn pre_order<'a>(&'a self, vec: &mut Vec<(&'a K, &'a V)>);
109    fn in_order<'a>(&'a self, vec: &mut Vec<(&'a K, &'a V)>);
110    fn post_order<'a>(&'a self, vec: &mut Vec<(&'a K, &'a V)>);
111    fn level_order<'a>(&'a self, vec: &mut Vec<(&'a K, &'a V)>, level: usize);
112}
113
114pub enum Traversals {
115    PreOrder,
116    InOrder,
117    PostOrder,
118    LevelOrder,
119}
120
121#[cfg(test)]
122mod tests {
123    use crate::bst::BST;
124    use crate::btree::BalancedTree;
125    use crate::rbtree::RedBlackTree;
126    use crate::SedgewickMap;
127
128    #[test]
129    fn its_42() {
130        assert_eq!(20 + 22, 42);
131    }
132
133    fn is_empty<K: Ord, V>(map: &impl SedgewickMap<K, V>) -> bool {
134        map.is_empty()
135    }
136
137    #[test]
138    fn test_empty() {
139        let bst: BST<i32, i32> = BST::new();
140        let rbt: RedBlackTree<i32, i32> = RedBlackTree::new();
141        let btree: BalancedTree<i32, i32> = BalancedTree::new();
142
143        assert_eq!(is_empty(&bst), true);
144        assert_eq!(is_empty(&rbt), true);
145        assert_eq!(is_empty(&btree), true);
146    }
147}