1use crate::{iter::TreeNode, prelude::TreeNodeMut};
2
3pub struct Node<T> {
41 pub value: T,
43 pub children: Vec<Node<T>>,
45}
46
47impl<T> Node<T> {
48 pub fn new(value: T) -> Self {
58 Self {
59 value,
60 children: Vec::new(),
61 }
62 }
63}
64
65impl<T> TreeNode for Node<T> {
69 fn children(&self) -> impl DoubleEndedIterator<Item = &Self> {
71 self.children.iter()
72 }
73}
74
75impl<T> TreeNodeMut for Node<T> {
79 fn children_mut(&mut self) -> impl DoubleEndedIterator<Item = &mut Self> {
81 self.children.iter_mut()
82 }
83}
84
85#[cfg(test)]
86mod tests {
87 use super::*;
88 use crate::prelude::*;
89
90 #[test]
91 fn test_empty_tree() {
92 let tree: Node<i32> = Node::new(42);
93 let values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
94 assert_eq!(values, vec![42]);
95
96 let values: Vec<i32> = tree.iter::<BreadthFirst>().map(|n| n.value).collect();
97 assert_eq!(values, vec![42]);
98 }
99
100 #[test]
101 fn test_depth_first_traversal() {
102 let tree = Node {
103 value: 1,
104 children: vec![
105 Node {
106 value: 2,
107 children: vec![Node::new(4), Node::new(5)],
108 },
109 Node {
110 value: 3,
111 children: vec![Node::new(6)],
112 },
113 ],
114 };
115
116 let values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
117 assert_eq!(values, vec![1, 2, 4, 5, 3, 6]);
118 }
119
120 #[test]
121 fn test_breadth_first_traversal() {
122 let tree = Node {
123 value: 1,
124 children: vec![
125 Node {
126 value: 2,
127 children: vec![Node::new(4), Node::new(5)],
128 },
129 Node {
130 value: 3,
131 children: vec![Node::new(6)],
132 },
133 ],
134 };
135
136 let values: Vec<i32> = tree.iter::<BreadthFirst>().map(|n| n.value).collect();
137 assert_eq!(values, vec![1, 2, 3, 4, 5, 6]);
138 }
139
140 #[test]
141 fn test_mutable_depth_first_traversal() {
142 let mut tree = Node {
143 value: 1,
144 children: vec![Node::new(2), Node::new(3)],
145 };
146
147 let mut iter = tree.iter_mut::<DepthFirst>();
149 while let Some(mut node) = iter.next() {
150 node.value *= 2;
151 }
152
153 let values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
155 assert_eq!(values, vec![2, 4, 6]);
156 }
157
158 #[test]
159 fn test_mutable_breadth_first_traversal() {
160 let mut tree = Node {
161 value: 1,
162 children: vec![
163 Node {
164 value: 2,
165 children: vec![Node::new(4)],
166 },
167 Node::new(3),
168 ],
169 };
170
171 let mut iter = tree.iter_mut::<BreadthFirst>();
173 while let Some(mut node) = iter.next() {
174 if node.value == 2 {
175 node.children.push(Node::new(10));
176 }
177 node.value += 10;
178 }
179
180 let values: Vec<i32> = tree.iter::<BreadthFirst>().map(|n| n.value).collect();
182 assert_eq!(values, vec![11, 12, 13, 14, 20]);
183 }
184
185 #[test]
186 fn test_tree_modification() {
187 let mut tree = Node {
189 value: 1,
190 children: vec![Node::new(2), Node::new(3)],
191 };
192
193 let initial_values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
195 assert_eq!(initial_values, vec![1, 2, 3]);
196
197 tree.children[0].children.push(Node::new(20));
199
200 tree.children[1].children.push(Node::new(30));
201
202 let final_values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
204 assert_eq!(final_values, vec![1, 2, 20, 3, 30]);
205 }
206
207 #[test]
208 fn test_complex_tree_traversal() {
209 let mut tree = Node {
211 value: 1,
212 children: vec![
213 Node {
214 value: 2,
215 children: vec![
216 Node {
217 value: 4,
218 children: vec![Node::new(7)],
219 },
220 Node::new(5),
221 ],
222 },
223 Node {
224 value: 3,
225 children: vec![Node {
226 value: 6,
227 children: vec![Node::new(8), Node::new(9)],
228 }],
229 },
230 ],
231 };
232
233 let df_values: Vec<i32> = tree.iter::<DepthFirst>().map(|n| n.value).collect();
235 assert_eq!(df_values, vec![1, 2, 4, 7, 5, 3, 6, 8, 9]);
236
237 let mut df_values_mut = vec![];
239 let mut iter = tree.iter_mut::<DepthFirst>();
240 while let Some(node) = iter.next() {
241 df_values_mut.push(node.value);
242 }
243 assert_eq!(df_values_mut, vec![1, 2, 4, 7, 5, 3, 6, 8, 9]);
244
245 let bf_values: Vec<i32> = tree.iter::<BreadthFirst>().map(|n| n.value).collect();
247 assert_eq!(bf_values, vec![1, 2, 3, 4, 5, 6, 7, 8, 9]);
248
249 let mut bf_values_mut = vec![];
251 let mut iter = tree.iter_mut::<BreadthFirst>();
252 while let Some(node) = iter.next() {
253 bf_values_mut.push(node.value);
254 }
255 assert_eq!(bf_values_mut, vec![1, 2, 3, 4, 5, 6, 7, 8, 9]);
256 }
257}