Created
January 23, 2024 05:20
-
-
Save utilForever/6f1518d0c21547a950775cf2ddebeebd to your computer and use it in GitHub Desktop.
Exercise - Binary Tree
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// A node in the binary tree. | |
#[derive(Debug)] | |
struct Node<T: Ord> { | |
value: T, | |
left: Subtree<T>, | |
right: Subtree<T>, | |
} | |
/// A possibly-empty subtree. | |
#[derive(Debug)] | |
struct Subtree<T: Ord>(Option<Box<Node<T>>>); | |
/// A container storing a set of values, using a binary tree. | |
/// | |
/// If the same value is added multiple times, it is only stored once. | |
#[derive(Debug)] | |
pub struct BinaryTree<T: Ord> { | |
root: Subtree<T>, | |
} | |
// Implement `new`, `insert`, `len`, and `has`. | |
#[cfg(test)] | |
mod tests { | |
use super::*; | |
#[test] | |
fn len() { | |
let mut tree = BinaryTree::new(); | |
assert_eq!(tree.len(), 0); | |
tree.insert(2); | |
assert_eq!(tree.len(), 1); | |
tree.insert(1); | |
assert_eq!(tree.len(), 2); | |
tree.insert(2); // not a unique item | |
assert_eq!(tree.len(), 2); | |
} | |
#[test] | |
fn has() { | |
let mut tree = BinaryTree::new(); | |
fn check_has(tree: &BinaryTree<i32>, exp: &[bool]) { | |
let got: Vec<bool> = | |
(0..exp.len()).map(|i| tree.has(&(i as i32))).collect(); | |
assert_eq!(&got, exp); | |
} | |
check_has(&tree, &[false, false, false, false, false]); | |
tree.insert(0); | |
check_has(&tree, &[true, false, false, false, false]); | |
tree.insert(4); | |
check_has(&tree, &[true, false, false, false, true]); | |
tree.insert(4); | |
check_has(&tree, &[true, false, false, false, true]); | |
tree.insert(3); | |
check_has(&tree, &[true, false, false, true, true]); | |
} | |
#[test] | |
fn unbalanced() { | |
let mut tree = BinaryTree::new(); | |
for i in 0..100 { | |
tree.insert(i); | |
} | |
assert_eq!(tree.len(), 100); | |
assert!(tree.has(&50)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment