dsalgo 0.3.10

A package for Datastructures and Algorithms.
Documentation
pub fn tree_dfs(
    g: &[Vec<usize>],
    root: usize,
) -> (Vec<usize>, Vec<usize>, Vec<usize>) {
    let n = g.len();

    let mut size = vec![1; n];

    let mut parent = vec![n; n];

    let mut depth = vec![0; n];

    fn dfs(
        g: &[Vec<usize>],
        parent: &mut [usize],
        depth: &mut [usize],
        size: &mut [usize],
        u: usize,
    ) {
        let d = depth[u] + 1;

        for &v in g[u].iter() {
            if v == parent[u] {
                continue;
            }

            parent[v] = u;

            depth[v] = d;

            dfs(g, parent, depth, size, v);

            size[u] += size[v];
        }
    }

    parent[root] = root;

    dfs(g, &mut parent, &mut depth, &mut size, root);

    (parent, depth, size)
}

#[cfg(test)]

mod tests {

    use super::*;

    #[test]

    fn test() {
        let cases = vec![(
            (5, vec![(0, 1), (0, 2), (1, 4), (3, 4)]),
            (vec![0, 0, 0, 4, 1], vec![0, 1, 1, 3, 2], vec![5, 3, 1, 1, 2]),
        )];

        use crate::adjacency_list_graph_from_edges::graph_from_edges;

        for ((n, edges), ans) in cases {
            let g = graph_from_edges(n, &edges, false);

            assert_eq!(tree_dfs(&g, 0), ans);
        }
    }
}