Exercise: Binary Tree
A binary tree is a tree-type data structure where every node has two children (left and right). We will create a tree where each node stores a value. For a given node N, all nodes in a N’s left subtree contain smaller values, and all nodes in N’s right subtree will contain larger values.
Implement the following types, so that the given tests pass.
Extra Credit: implement an iterator over a binary tree that returns the values in order.
/// 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>,}impl<T: Ord> BinaryTree<T> {fn new() -> Self {Self { root: Subtree::new() }}fn insert(&mut self, value: T) {self.root.insert(value);}fn has(&self, value: &T) -> bool {self.root.has(value)}fn len(&self) -> usize {self.root.len()}}// Implement `new`, `insert`, `len`, and `has` for `Subtree`.#[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 itemassert_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));}}