use crate::graph::{GraphRooted, GraphSucc, node_map::NodeMap};
fn impl_preorder<G: GraphSucc>(
graph: G,
vis: &mut NodeMap<G, bool>,
items: &mut Vec<G::Node>,
node: G::Node,
) {
debug_assert!(!vis[node]);
vis[node] = true;
items.push(node);
for node in graph.succ_of(node) {
if !vis[node] {
impl_preorder(graph, vis, items, node);
}
}
}
pub fn preorder_from<G: GraphSucc>(graph: G, roots: &[G::Node]) -> Vec<G::Node> {
let mut vis = NodeMap::new_with(graph, |_| false);
let mut items = vec![];
for &root in roots {
if !vis[root] {
impl_preorder(graph, &mut vis, &mut items, root);
}
}
items
}
pub fn preorder<G: GraphSucc + GraphRooted>(graph: G) -> Vec<G::Node> {
let mut vis = NodeMap::new_with(graph, |_| false);
let mut items = vec![];
impl_preorder(graph, &mut vis, &mut items, graph.root_node());
items
}