1. use std::cmp::Ordering;
3. /// A node in the binary tree.
4. #[derive(Debug)]
5. struct Node<T: Ord> {
6. value: T,
7. left: Subtree<T>,
8. right: Subtree<T>,
9. }
11. /// A possibly-empty subtree.
12. #[derive(Debug)]
13. struct Subtree<T: Ord>(Option<Box<Node<T>>>);
15. /// A container storing a set of values, using a binary tree.
16. ///
17. /// If the same value is added multiple times, it is only stored once.
18. #[derive(Debug)]
19. pub struct BinaryTree<T: Ord> {
20. root: Subtree<T>,
21. }
23. impl<T: Ord> BinaryTree<T> {
24. fn new() -> Self {
25. Self { root: Subtree::new() }
26. }
28. fn insert(&mut self, value: T) {
29. self.root.insert(value);
30. }
32. fn has(&self, value: &T) -> bool {
33. self.root.has(value)
34. }
36. fn len(&self) -> usize {
37. self.root.len()
38. }
39. }
41. impl<T: Ord> Subtree<T> {
42. fn new() -> Self {
43. Self(None)
44. }
46. fn insert(&mut self, value: T) {
47. match &mut self.0 {
48. None => self.0 = Some(Box::new(Node::new(value))),
49. Some(n) => match value.cmp(&n.value) {
50. Ordering::Less => n.left.insert(value),
51. Ordering::Equal => {}
52. Ordering::Greater => n.right.insert(value),
53. },
54. }
55. }
57. fn has(&self, value: &T) -> bool {
58. match &self.0 {
59. None => false,
60. Some(n) => match value.cmp(&n.value) {
61. Ordering::Less => n.left.has(value),
62. Ordering::Equal => true,
63. Ordering::Greater => n.right.has(value),
64. },
65. }
66. }
68. fn len(&self) -> usize {
69. match &self.0 {
70. None => 0,
71. Some(n) => 1 + n.left.len() + n.right.len(),
72. }
73. }
74. }
76. impl<T: Ord> Node<T> {
77. fn new(value: T) -> Self {
78. Self { value, left: Subtree::new(), right: Subtree::new() }
79. }
80. }
82. fn main() {
83. let mut tree = BinaryTree::new();
84. tree.insert("foo");
85. assert_eq!(tree.len(), 1);
86. tree.insert("bar");
87. assert!(tree.has(&"foo"));
88. }
90. #[cfg(test)]
91. mod tests {
92. use super::*;
94. #[test]
95. fn len() {
96. let mut tree = BinaryTree::new();
97. assert_eq!(tree.len(), 0);
98. tree.insert(2);
99. assert_eq!(tree.len(), 1);
100. tree.insert(1);
101. assert_eq!(tree.len(), 2);
102. tree.insert(2); // not a unique item
103. assert_eq!(tree.len(), 2);
104. }
106. #[test]
107. fn has() {
108. let mut tree = BinaryTree::new();
109. fn check_has(tree: &BinaryTree<i32>, exp: &[bool]) {
110. let got: Vec<bool> =
111. (0..exp.len()).map(|i| tree.has(&(i as i32))).collect();
112. assert_eq!(&got, exp);
113. }
115. check_has(&tree, &[false, false, false, false, false]);
116. tree.insert(0);
117. check_has(&tree, &[true, false, false, false, false]);
118. tree.insert(4);
119. check_has(&tree, &[true, false, false, false, true]);
120. tree.insert(4);
121. check_has(&tree, &[true, false, false, false, true]);
122. tree.insert(3);
123. check_has(&tree, &[true, false, false, true, true]);
124. }
126. #[test]
127. fn unbalanced() {
128. let mut tree = BinaryTree::new();
129. for i in 0..100 {
130. tree.insert(i);
131. }
132. assert_eq!(tree.len(), 100);
133. assert!(tree.has(&50));
134. }
135. }