1use crate::{iter::TreeNode, prelude::TreeNodeMut};
2
3#[derive(Debug, Clone, PartialEq, Eq, Default, Hash)]
32pub struct Node<T> {
33 pub value: T,
35 pub children: Vec<Node<T>>,
37}
38
39impl<T> Node<T> {
40 pub fn new(value: T) -> Self {
50 Self {
51 value,
52 children: Vec::new(),
53 }
54 }
55}
56
57impl<T> TreeNode for Node<T> {
61 fn children(&self) -> impl DoubleEndedIterator<Item = &Self> {
63 self.children.iter()
64 }
65}
66
67impl<T> TreeNodeMut for Node<T> {
71 fn children_mut(&mut self) -> impl DoubleEndedIterator<Item = &mut Self> {
73 self.children.iter_mut()
74 }
75}
76
77#[cfg(test)]
78mod tests {
79 use super::*;
80 use crate::prelude::*;
81
82 #[test]
83 fn test_empty_tree() {
84 let tree: Node<i32> = Node::new(42);
85 let values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
86 assert_eq!(values, vec![42]);
87
88 let values: Vec<i32> = tree.iter::<BreadthFirst>().map(|n| n.value).collect();
89 assert_eq!(values, vec![42]);
90 }
91
92 #[test]
93 fn test_depth_first_traversal() {
94 let tree = Node {
95 value: 1,
96 children: vec![
97 Node {
98 value: 2,
99 children: vec![Node::new(4), Node::new(5)],
100 },
101 Node {
102 value: 3,
103 children: vec![Node::new(6)],
104 },
105 ],
106 };
107
108 let values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
109 assert_eq!(values, vec![1, 2, 4, 5, 3, 6]);
110 }
111
112 #[test]
113 fn test_breadth_first_traversal() {
114 let tree = Node {
115 value: 1,
116 children: vec![
117 Node {
118 value: 2,
119 children: vec![Node::new(4), Node::new(5)],
120 },
121 Node {
122 value: 3,
123 children: vec![Node::new(6)],
124 },
125 ],
126 };
127
128 let values: Vec<i32> = tree.iter::<BreadthFirst>().map(|n| n.value).collect();
129 assert_eq!(values, vec![1, 2, 3, 4, 5, 6]);
130 }
131
132 #[test]
133 fn test_mutable_depth_first_traversal() {
134 let mut tree = Node {
135 value: 1,
136 children: vec![Node::new(2), Node::new(3)],
137 };
138
139 let mut iter = tree.iter_mut::<DepthFirst>();
141 while let Some(mut node) = iter.next() {
142 node.value *= 2;
143 }
144
145 let values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
147 assert_eq!(values, vec![2, 4, 6]);
148 }
149
150 #[test]
151 fn test_mutable_breadth_first_traversal() {
152 let mut tree = Node {
153 value: 1,
154 children: vec![
155 Node {
156 value: 2,
157 children: vec![Node::new(4)],
158 },
159 Node::new(3),
160 ],
161 };
162
163 let mut iter = tree.iter_mut::<BreadthFirst>();
165 while let Some(mut node) = iter.next() {
166 if node.value == 2 {
167 node.children.push(Node::new(10));
168 }
169 node.value += 10;
170 }
171
172 let values: Vec<i32> = tree.iter::<BreadthFirst>().map(|n| n.value).collect();
174 assert_eq!(values, vec![11, 12, 13, 14, 20]);
175 }
176
177 #[test]
178 fn test_tree_modification() {
179 let mut tree = Node {
181 value: 1,
182 children: vec![Node::new(2), Node::new(3)],
183 };
184
185 let initial_values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
187 assert_eq!(initial_values, vec![1, 2, 3]);
188
189 tree.children[0].children.push(Node::new(20));
191 tree.children[1].children.push(Node::new(30));
192
193 let final_values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
195 assert_eq!(final_values, vec![1, 2, 20, 3, 30]);
196 }
197
198 #[test]
199 fn test_forest_traversal() {
200 let mut forest = vec![
202 Node {
203 value: 1,
204 children: vec![Node::new(2)],
205 },
206 Node {
207 value: 3,
208 children: vec![Node::new(4)],
209 },
210 ];
211 let mut iter = TreeMutIter::<'_, _, BreadthFirst>::new(forest.iter_mut());
213 while let Some(mut node) = iter.next() {
214 node.value += 10;
215 }
216 let value = TreeIter::<'_, _, BreadthFirst>::new(forest.iter())
218 .map(|node| node.value)
219 .collect::<Vec<_>>();
220 assert_eq!(value, vec![11, 13, 12, 14]);
221 }
222
223 #[test]
224 fn test_complex_tree_traversal() {
225 let mut tree = Node {
227 value: 1,
228 children: vec![
229 Node {
230 value: 2,
231 children: vec![
232 Node {
233 value: 4,
234 children: vec![Node::new(7)],
235 },
236 Node::new(5),
237 ],
238 },
239 Node {
240 value: 3,
241 children: vec![Node {
242 value: 6,
243 children: vec![Node::new(8), Node::new(9)],
244 }],
245 },
246 ],
247 };
248
249 let df_values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
251 assert_eq!(df_values, vec![1, 2, 4, 7, 5, 3, 6, 8, 9]);
252
253 let mut df_values_mut = vec![];
255 let mut iter = tree.iter_mut::<DepthFirst>();
256 while let Some(node) = iter.next() {
257 df_values_mut.push(node.value);
258 }
259 assert_eq!(df_values_mut, vec![1, 2, 4, 7, 5, 3, 6, 8, 9]);
260
261 let bf_values: Vec<i32> = tree.iter::<BreadthFirst>().map(|n| n.value).collect();
263 assert_eq!(bf_values, vec![1, 2, 3, 4, 5, 6, 7, 8, 9]);
264
265 let mut bf_values_mut = vec![];
267 let mut iter = tree.iter_mut::<BreadthFirst>();
268 while let Some(node) = iter.next() {
269 bf_values_mut.push(node.value);
270 }
271 assert_eq!(bf_values_mut, vec![1, 2, 3, 4, 5, 6, 7, 8, 9]);
272 }
273}