use crate::graph::{GraphRooted, GraphSucc, node_map::NodeMap};
fn impl_postorder<G: GraphSucc>(
graph: G,
vis: &mut NodeMap<G, bool>,
items: &mut Vec<G::Node>,
node: G::Node,
) {
debug_assert!(!vis[node]);
vis[node] = true;
for node in graph.succ_of(node) {
if !vis[node] {
impl_postorder(graph, vis, items, node);
}
}
items.push(node);
}
pub fn postorder_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_postorder(graph, &mut vis, &mut items, root);
}
}
items
}
pub fn postorder_all<G: GraphSucc>(graph: G) -> Vec<G::Node> {
let mut vis = NodeMap::new_with(graph, |_| false);
let mut items = vec![];
for node in graph.nodes() {
if !vis[node] {
impl_postorder(graph, &mut vis, &mut items, node);
}
}
items
}
pub fn postorder<G: GraphSucc + GraphRooted>(graph: G) -> Vec<G::Node> {
let mut vis = NodeMap::new_with(graph, |_| false);
let mut items = vec![];
impl_postorder(graph, &mut vis, &mut items, graph.root_node());
items
}
pub fn reverse_postorder_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_postorder(graph, &mut vis, &mut items, root);
}
}
items.reverse();
items
}
pub fn reverse_postorder_all<G: GraphSucc>(graph: G) -> Vec<G::Node> {
let mut vis = NodeMap::new_with(graph, |_| false);
let mut items = vec![];
for node in graph.nodes() {
if !vis[node] {
impl_postorder(graph, &mut vis, &mut items, node);
}
}
items.reverse();
items
}
pub fn reverse_postorder<G: GraphSucc + GraphRooted>(graph: G) -> Vec<G::Node> {
let mut vis = NodeMap::new_with(graph, |_| false);
let mut items = vec![];
impl_postorder(graph, &mut vis, &mut items, graph.root_node());
items.reverse();
items
}