pub struct IterativeBST<T: Ord> { /* private fields */ }
Expand description
Iterative Binary Search Tree implementation.
§Important
This should be preferred over RecursiveBST for reasons listed in crate level documentation.
Implementations§
Source§impl<T: Ord> IterativeBST<T>
impl<T: Ord> IterativeBST<T>
Sourcepub fn new() -> IterativeBST<T>
pub fn new() -> IterativeBST<T>
Creates an empty IterativeBST<T>
No nodes are allocated on the heap yet
§Examples
use bst_rs::{BinarySearchTree, IterativeBST};
// Empty tree is created
let mut bst: IterativeBST<i32> = IterativeBST::new();
assert!(bst.is_empty())
Trait Implementations§
Source§impl<T: Ord> BinarySearchTree<T> for IterativeBST<T>
impl<T: Ord> BinarySearchTree<T> for IterativeBST<T>
Source§fn size(&self) -> usize
fn size(&self) -> usize
Returns the total number of nodes within the tree.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(5);
bst.insert(10);
bst.insert(3);
assert_eq!(bst.size(), 3);
Source§fn is_empty(&self) -> bool
fn is_empty(&self) -> bool
Returns true
if the binary search tree contains no nodes.
§Examples
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst: IterativeBST<i32> = IterativeBST::new();
assert!(bst.is_empty());
Source§fn is_not_empty(&self) -> bool
fn is_not_empty(&self) -> bool
Returns true
if the binary search tree contains one or more nodes.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
assert!(bst.is_empty());
bst.insert(2);
assert!(bst.is_not_empty());
Source§fn insert(&mut self, value: T)
fn insert(&mut self, value: T)
Inserts given value as a node.
Duplicate values are not allowed.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(10);
bst.insert(10); // Element is not inserted
bst.insert(5);
bst.insert(2);
bst.insert(15);
bst.insert(25);
assert_eq!(bst.size(), 5);
Source§fn contains(&self, value: &T) -> bool
fn contains(&self, value: &T) -> bool
Returns true
if the binary search tree contains an element with the given value.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(5);
bst.insert(2);
bst.insert(7);
assert!(bst.contains(&5));
assert!(!bst.contains(&10));
Source§fn remove(&mut self, value: &T)
fn remove(&mut self, value: &T)
Removes the given value.
Tree will not be modified if trying to remove element that does not exist.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(5);
bst.insert(2);
bst.insert(7);
assert_eq!(bst.size(), 3);
bst.remove(&5);
bst.remove(&10); // Element is not removed
assert_eq!(bst.size(), 2);
Source§fn retrieve(&self, value: &T) -> Option<&T>
fn retrieve(&self, value: &T) -> Option<&T>
Returns a reference to the element or None
if element does not exist.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(5);
bst.insert(2);
bst.insert(7);
assert_eq!(bst.retrieve(&5), Some(&5));
assert_eq!(bst.retrieve(&10), None);
Source§fn retrieve_as_mut(&mut self, value: &T) -> Option<&mut T>
fn retrieve_as_mut(&mut self, value: &T) -> Option<&mut T>
Returns a mutable reference to the element (see IterativeBST::retrieve())
or None
if element does not exist.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(10);
bst.insert(5);
let optional_retrieved_value_as_mut = bst.retrieve_as_mut(&5);
assert_eq!(optional_retrieved_value_as_mut, Some(&mut 5));
let mut retrieved_value = optional_retrieved_value_as_mut.unwrap();
*retrieved_value = 2; // Change value inside tree to '2'
assert_eq!(bst.retrieve_as_mut(&5), None); // 5 does not exist anymore
assert_eq!(bst.retrieve_as_mut(&2), Some(&mut 2));
Source§fn height(&self) -> Option<isize>
fn height(&self) -> Option<isize>
Returns the height or None
if tree is empty.
The height is the number of edges between the root and it’s furthest leaf node.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
// Given a tree that looks like:
// 4
// / \
// 2 6
// / \ / \
// 1 3 5 7
let mut bst = IterativeBST::new();
assert_eq!(bst.height(), None);
bst.insert(4);
bst.insert(6);
bst.insert(2);
bst.insert(7);
bst.insert(5);
bst.insert(3);
bst.insert(1);
// The height is 2.
assert_eq!(bst.height(), Some(2));
Source§fn min(&self) -> Option<&T>
fn min(&self) -> Option<&T>
Returns a reference to the minimum element of the tree or None
if tree is empty.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
assert_eq!(bst.min(), None);
bst.insert(5);
bst.insert(2);
bst.insert(10);
assert_eq!(bst.min(), Some(&2));
Source§fn max(&self) -> Option<&T>
fn max(&self) -> Option<&T>
Returns a reference to the maximum element of the tree or None
if tree is empty.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
assert_eq!(bst.max(), None);
bst.insert(5);
bst.insert(2);
bst.insert(10);
assert_eq!(bst.max(), Some(&10));
Source§fn remove_min(&mut self) -> Option<T>
fn remove_min(&mut self) -> Option<T>
Removes and returns the minimum element from the tree or None
if tree is empty.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
assert_eq!(bst.remove_min(), None);
bst.insert(2);
bst.insert(5);
bst.insert(10);
assert_eq!(bst.size(), 3);
assert_eq!(bst.remove_min(), Some(2));
assert_eq!(bst.size(), 2);
Source§fn remove_max(&mut self) -> Option<T>
fn remove_max(&mut self) -> Option<T>
Removes and returns the maximum element from the tree or None
if tree is empty.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
assert_eq!(bst.remove_max(), None);
bst.insert(2);
bst.insert(5);
bst.insert(10);
assert_eq!(bst.size(), 3);
assert_eq!(bst.remove_max(), Some(10));
assert_eq!(bst.size(), 2);
Source§fn asc_order_vec(&self) -> Vec<&T>
fn asc_order_vec(&self) -> Vec<&T>
Returns references to the elements of the tree in ascending order.`
§Important
This is function is analogous to IterativeBST::in_order_vec() as the underlying behaviour is exactly the same.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(4);
bst.insert(6);
bst.insert(2);
bst.insert(7);
bst.insert(5);
bst.insert(3);
bst.insert(1);
assert_eq!(bst.asc_order_vec(), vec![&1, &2, &3, &4, &5, &6, &7]);
Source§fn pre_order_vec(&self) -> Vec<&T>
fn pre_order_vec(&self) -> Vec<&T>
Returns references to the elements of the tree in the order of a pre-order traversal.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
// Given a tree that looks like:
// 4
// / \
// 2 6
// / \ / \
// 1 3 5 7
let mut bst = IterativeBST::new();
bst.insert(4);
bst.insert(6);
bst.insert(2);
bst.insert(7);
bst.insert(5);
bst.insert(3);
bst.insert(1);
// The pre_order_vec is: [&4, &2, &1, &3, &6, &5, &7]
assert_eq!(bst.pre_order_vec(), vec![&4, &2, &1, &3, &6, &5, &7]);
Source§fn in_order_vec(&self) -> Vec<&T>
fn in_order_vec(&self) -> Vec<&T>
Returns references to the elements of the tree in the order of an in-order traversal.
§Important
This is function is analogous to IterativeBST::asc_order_vec() as the underlying behaviour is exactly the same.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
// Given a tree that looks like:
// 4
// / \
// 2 6
// / \ / \
// 1 3 5 7
let mut bst = IterativeBST::new();
bst.insert(4);
bst.insert(6);
bst.insert(2);
bst.insert(7);
bst.insert(5);
bst.insert(3);
bst.insert(1);
// The in_order_vec is: [&1, &2, &3, &4, &5, &6, &7]
assert_eq!(bst.in_order_vec(), vec![&1, &2, &3, &4, &5, &6, &7]);
Source§fn post_order_vec(&self) -> Vec<&T>
fn post_order_vec(&self) -> Vec<&T>
Returns references to the elements of the tree in the order of a post-order traversal.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
// Given a tree that looks like:
// 4
// / \
// 2 6
// / \ / \
// 1 3 5 7
let mut bst = IterativeBST::new();
bst.insert(4);
bst.insert(6);
bst.insert(2);
bst.insert(7);
bst.insert(5);
bst.insert(3);
bst.insert(1);
// The post_order_vec is: [&1, &3, &2, &5, &7, &6, &4]
assert_eq!(bst.post_order_vec(), vec![&1, &3, &2, &5, &7, &6, &4]);
Source§fn level_order_vec(&self) -> Vec<&T>
fn level_order_vec(&self) -> Vec<&T>
Returns references to the elements of the tree in the order of a level-order traversal.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
// Given a tree that looks like:
// 4
// / \
// 2 6
// / \ / \
// 1 3 5 7
let mut bst = IterativeBST::new();
bst.insert(4);
bst.insert(6);
bst.insert(2);
bst.insert(7);
bst.insert(5);
bst.insert(3);
bst.insert(1);
// The level_order_vec is: [&4, &2, &6, &1, &3, &5, &7]
assert_eq!(bst.level_order_vec(), vec![&4, &2, &6, &1, &3, &5, &7]);
Source§fn asc_order_iter(&self) -> IntoIter<&T>
fn asc_order_iter(&self) -> IntoIter<&T>
Returns an iterator over IterativeBST::asc_order_vec().
§Important
This is function is analogous to IterativeBST::in_order_iter() as the underlying behaviour is exactly the same.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(3);
bst.insert(4);
bst.insert(5);
bst.insert(1);
bst.insert(2);
let mut asc_order_iter = bst.asc_order_iter();
assert_eq!(asc_order_iter.next(), Some(&1));
assert_eq!(asc_order_iter.next(), Some(&2));
assert_eq!(asc_order_iter.next(), Some(&3));
assert_eq!(asc_order_iter.next(), Some(&4));
assert_eq!(asc_order_iter.next(), Some(&5));
assert_eq!(asc_order_iter.next(), None);
Source§fn pre_order_iter(&self) -> IntoIter<&T>
fn pre_order_iter(&self) -> IntoIter<&T>
Returns an iterator over IterativeBST::pre_order_vec().
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(3);
bst.insert(4);
bst.insert(5);
bst.insert(1);
bst.insert(2);
let mut pre_order_iter = bst.pre_order_iter();
assert_eq!(pre_order_iter.next(), Some(&3));
assert_eq!(pre_order_iter.next(), Some(&1));
assert_eq!(pre_order_iter.next(), Some(&2));
assert_eq!(pre_order_iter.next(), Some(&4));
assert_eq!(pre_order_iter.next(), Some(&5));
assert_eq!(pre_order_iter.next(), None);
Source§fn in_order_iter(&self) -> IntoIter<&T>
fn in_order_iter(&self) -> IntoIter<&T>
Returns an iterator over IterativeBST::in_order_vec().
§Important
This is function is analogous to IterativeBST::asc_order_iter() as the underlying behaviour is exactly the same.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(3);
bst.insert(4);
bst.insert(5);
bst.insert(1);
bst.insert(2);
let mut in_order_iter = bst.in_order_iter();
assert_eq!(in_order_iter.next(), Some(&1));
assert_eq!(in_order_iter.next(), Some(&2));
assert_eq!(in_order_iter.next(), Some(&3));
assert_eq!(in_order_iter.next(), Some(&4));
assert_eq!(in_order_iter.next(), Some(&5));
assert_eq!(in_order_iter.next(), None);
Source§fn post_order_iter(&self) -> IntoIter<&T>
fn post_order_iter(&self) -> IntoIter<&T>
Returns an iterator over IterativeBST::post_order_vec().
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(3);
bst.insert(4);
bst.insert(5);
bst.insert(1);
bst.insert(2);
let mut post_order_iter = bst.post_order_iter();
assert_eq!(post_order_iter.next(), Some(&2));
assert_eq!(post_order_iter.next(), Some(&1));
assert_eq!(post_order_iter.next(), Some(&5));
assert_eq!(post_order_iter.next(), Some(&4));
assert_eq!(post_order_iter.next(), Some(&3));
assert_eq!(post_order_iter.next(), None);
Source§fn level_order_iter(&self) -> IntoIter<&T>
fn level_order_iter(&self) -> IntoIter<&T>
Returns an iterator over IterativeBST::level_order_vec().
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(3);
bst.insert(4);
bst.insert(5);
bst.insert(1);
bst.insert(2);
let mut level_order_iter = bst.level_order_iter();
assert_eq!(level_order_iter.next(), Some(&3));
assert_eq!(level_order_iter.next(), Some(&1));
assert_eq!(level_order_iter.next(), Some(&4));
assert_eq!(level_order_iter.next(), Some(&2));
assert_eq!(level_order_iter.next(), Some(&5));
assert_eq!(level_order_iter.next(), None);
Source§fn into_asc_order_iter(self) -> IntoIter<T>
fn into_asc_order_iter(self) -> IntoIter<T>
Returns IterativeBST::asc_order_iter() AND consumes the tree.
§Important
This is function is analogous to IterativeBST::into_in_order_iter() as the underlying behaviour is exactly the same.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(3);
bst.insert(4);
bst.insert(5);
bst.insert(1);
bst.insert(2);
let mut into_asc_order_iter = bst.into_asc_order_iter();
assert_eq!(into_asc_order_iter.next(), Some(1));
assert_eq!(into_asc_order_iter.next(), Some(2));
assert_eq!(into_asc_order_iter.next(), Some(3));
assert_eq!(into_asc_order_iter.next(), Some(4));
assert_eq!(into_asc_order_iter.next(), Some(5));
assert_eq!(into_asc_order_iter.next(), None);
// bst.insert(10); -> COMPILE ERROR
Source§fn into_pre_order_iter(self) -> IntoIter<T>
fn into_pre_order_iter(self) -> IntoIter<T>
Returns IterativeBST::pre_order_iter() AND consumes the tree.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(3);
bst.insert(4);
bst.insert(5);
bst.insert(1);
bst.insert(2);
let mut into_pre_order_iter = bst.into_pre_order_iter();
assert_eq!(into_pre_order_iter.next(), Some(3));
assert_eq!(into_pre_order_iter.next(), Some(1));
assert_eq!(into_pre_order_iter.next(), Some(2));
assert_eq!(into_pre_order_iter.next(), Some(4));
assert_eq!(into_pre_order_iter.next(), Some(5));
assert_eq!(into_pre_order_iter.next(), None);
// bst.insert(10); -> COMPILE ERROR
Source§fn into_in_order_iter(self) -> IntoIter<T>
fn into_in_order_iter(self) -> IntoIter<T>
Returns IterativeBST::in_order_iter() AND consumes the tree.
§Important
This is function is analogous to IterativeBST::asc_order_iter() as the underlying behaviour is exactly the same.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(3);
bst.insert(4);
bst.insert(5);
bst.insert(1);
bst.insert(2);
let mut into_in_order_iter = bst.into_in_order_iter();
assert_eq!(into_in_order_iter.next(), Some(1));
assert_eq!(into_in_order_iter.next(), Some(2));
assert_eq!(into_in_order_iter.next(), Some(3));
assert_eq!(into_in_order_iter.next(), Some(4));
assert_eq!(into_in_order_iter.next(), Some(5));
assert_eq!(into_in_order_iter.next(), None);
// bst.insert(10); -> COMPILE ERROR
Source§fn into_post_order_iter(self) -> IntoIter<T>
fn into_post_order_iter(self) -> IntoIter<T>
Returns IterativeBST::post_order_iter() AND consumes the tree.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(3);
bst.insert(4);
bst.insert(5);
bst.insert(1);
bst.insert(2);
let mut into_post_order_iter = bst.into_post_order_iter();
assert_eq!(into_post_order_iter.next(), Some(2));
assert_eq!(into_post_order_iter.next(), Some(1));
assert_eq!(into_post_order_iter.next(), Some(5));
assert_eq!(into_post_order_iter.next(), Some(4));
assert_eq!(into_post_order_iter.next(), Some(3));
assert_eq!(into_post_order_iter.next(), None);
// bst.insert(10); -> COMPILE ERROR
Source§fn into_level_order_iter(self) -> IntoIter<T>
fn into_level_order_iter(self) -> IntoIter<T>
Returns IterativeBST::level_order_iter() AND consumes the tree.
§Example
use bst_rs::{BinarySearchTree, IterativeBST};
let mut bst = IterativeBST::new();
bst.insert(3);
bst.insert(4);
bst.insert(5);
bst.insert(1);
bst.insert(2);
let mut into_level_order_iter = bst.into_level_order_iter();
assert_eq!(into_level_order_iter.next(), Some(3));
assert_eq!(into_level_order_iter.next(), Some(1));
assert_eq!(into_level_order_iter.next(), Some(4));
assert_eq!(into_level_order_iter.next(), Some(2));
assert_eq!(into_level_order_iter.next(), Some(5));
assert_eq!(into_level_order_iter.next(), None);
// bst.insert(10); -> COMPILE ERROR
Source§impl<T: Ord> Default for IterativeBST<T>
impl<T: Ord> Default for IterativeBST<T>
Source§fn default() -> IterativeBST<T>
fn default() -> IterativeBST<T>
Creates an empty IterativeBST<T>
Source§impl<T: Ord> Extend<T> for IterativeBST<T>
impl<T: Ord> Extend<T> for IterativeBST<T>
Source§fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one
)