orx_tree/traversal/breadth_first/traverser.rs
1use super::queue::Queue;
2use crate::traversal::{
3 over::{Over, OverData},
4 traverser::Traverser,
5};
6
7/// A breadth first search traverser, also known as level-order
8/// ([wikipedia](https://en.wikipedia.org/wiki/Tree_traversal#Breadth-first_search)).
9///
10/// A traverser can be created once and used to traverse over trees multiple times without
11/// requiring additional memory allocation.
12///
13/// # Construction
14///
15/// A depth first traverser can be created,
16/// * either by using Default trait and providing its two generic type parameters
17/// * `Dfs::<_, OverData>::default()` or `Dfs::<_, OverDepthSiblingIdxData>::default()`, or
18/// * `Dfs::<Dyn<u64>, OverData>::default()` or `Dfs::<Dary<2, String>, OverDepthSiblingIdxData>::default()`
19/// if we want the complete type signature.
20/// * or by using the [`Traversal`] type.
21/// * `Traversal.dfs()` or `Traversal.dfs().with_depth().with_sibling_idx()`.
22///
23/// [`Traversal`]: crate::Traversal
24pub struct Bfs<O = OverData>
25where
26 O: Over,
27{
28 pub(crate) queue: Queue<O::Enumeration>,
29}
30
31impl Default for Bfs {
32 fn default() -> Self {
33 Self::new()
34 }
35}
36
37impl<O> Traverser<O> for Bfs<O>
38where
39 O: Over,
40{
41 type IntoOver<O2>
42 = Bfs<O2>
43 where
44 O2: Over;
45
46 fn new() -> Self {
47 Self {
48 queue: Default::default(),
49 }
50 }
51
52 fn transform_into<O2: Over>(self) -> Self::IntoOver<O2> {
53 Bfs::<O2>::new()
54 }
55}