练习:二叉树

二元树是一种树型数据结构,其中每个节点都有两个子节点(左侧和右侧)。我们将创建一个树状结构,其中每个节点存储一个值。对于给定的节点 N,N 的左侧子树中的所有节点都包含较小的值,而 N 的右侧子树中的所有节点都将包含较大的值。

实现以下类型,以便通过指定的测试。

额外提示:对按顺序返回值的二元树实现迭代器。

  1. /// A node in the binary tree.
  2. #[derive(Debug)]
  3. struct Node<T: Ord> {
  4. value: T,
  5. left: Subtree<T>,
  6. right: Subtree<T>,
  7. }
  8. /// A possibly-empty subtree.
  9. #[derive(Debug)]
  10. struct Subtree<T: Ord>(Option<Box<Node<T>>>);
  11. /// A container storing a set of values, using a binary tree.
  12. ///
  13. /// If the same value is added multiple times, it is only stored once.
  14. #[derive(Debug)]
  15. pub struct BinaryTree<T: Ord> {
  16. root: Subtree<T>,
  17. }
  18. // Implement `new`, `insert`, `len`, and `has`.
  19. #[cfg(test)]
  20. mod tests {
  21. use super::*;
  22. #[test]
  23. fn len() {
  24. let mut tree = BinaryTree::new();
  25. assert_eq!(tree.len(), 0);
  26. tree.insert(2);
  27. assert_eq!(tree.len(), 1);
  28. tree.insert(1);
  29. assert_eq!(tree.len(), 2);
  30. tree.insert(2); // not a unique item
  31. assert_eq!(tree.len(), 2);
  32. }
  33. #[test]
  34. fn has() {
  35. let mut tree = BinaryTree::new();
  36. fn check_has(tree: &BinaryTree<i32>, exp: &[bool]) {
  37. let got: Vec<bool> =
  38. (0..exp.len()).map(|i| tree.has(&(i as i32))).collect();
  39. assert_eq!(&got, exp);
  40. }
  41. check_has(&tree, &[false, false, false, false, false]);
  42. tree.insert(0);
  43. check_has(&tree, &[true, false, false, false, false]);
  44. tree.insert(4);
  45. check_has(&tree, &[true, false, false, false, true]);
  46. tree.insert(4);
  47. check_has(&tree, &[true, false, false, false, true]);
  48. tree.insert(3);
  49. check_has(&tree, &[true, false, false, true, true]);
  50. }
  51. #[test]
  52. fn unbalanced() {
  53. let mut tree = BinaryTree::new();
  54. for i in 0..100 {
  55. tree.insert(i);
  56. }
  57. assert_eq!(tree.len(), 100);
  58. assert!(tree.has(&50));
  59. }
  60. }