use super::*;
use std::collections::VecDeque;
pub struct IterBFS<'a, T> {
queue: VecDeque<&'a Node<T>>,
}
impl<'a, T> IterBFS<'a, T> {
pub(crate) fn new(node: &'a Node<T>) -> Self {
let mut queue = VecDeque::new();
queue.push_back(node);
Self { queue }
}
}
impl<'a, T> Iterator for IterBFS<'a, T> {
type Item = &'a Node<T>;
fn next(&mut self) -> Option<Self::Item> {
let popped = self.queue.pop_front();
if let Some(popped) = popped {
self.queue.extend(popped.children().iter());
}
popped
}
}
pub struct IterDFS<'a, T> {
stack: Vec<&'a Node<T>>,
}
impl<'a, T> IterDFS<'a, T> {
pub(crate) fn new(node: &'a Node<T>) -> Self {
Self { stack: vec![node] }
}
}
impl<'a, T> Iterator for IterDFS<'a, T> {
type Item = &'a Node<T>;
fn next(&mut self) -> Option<Self::Item> {
let popped = self.stack.pop();
if let Some(popped) = popped {
self.stack.extend(popped.children().iter().rev());
}
popped
}
}