use super::super::indexed_vec::IndexVec; use super::{DirectedGraph, WithSuccessors, WithNumNodes}; #[cfg(test)] mod test; pub fn post_order_from( graph: &G, start_node: G::Node, ) -> Vec { post_order_from_to(graph, start_node, None) } pub fn post_order_from_to( graph: &G, start_node: G::Node, end_node: Option, ) -> Vec { let mut visited: IndexVec = IndexVec::from_elem_n(false, graph.num_nodes()); let mut result: Vec = Vec::with_capacity(graph.num_nodes()); if let Some(end_node) = end_node { visited[end_node] = true; } post_order_walk(graph, start_node, &mut result, &mut visited); result } fn post_order_walk( graph: &G, node: G::Node, result: &mut Vec, visited: &mut IndexVec, ) { if visited[node] { return; } visited[node] = true; for successor in graph.successors(node) { post_order_walk(graph, successor, result, visited); } result.push(node); } pub fn reverse_post_order( graph: &G, start_node: G::Node, ) -> Vec { let mut vec = post_order_from(graph, start_node); vec.reverse(); vec }