Pseudocode
void change_root(int old_root, int new_root) {
// Update data structures as if `new_root` was being removed as a child from `old_root`
// Update data structures as if `old_root` was being added as a child to `new_root`
}
void walk(int vertex, int parent) {
// Data structures now reflect the tree as if `vertex` were the root
for (child in adjacency_list[vertex]) {
if (child == parent) continue;
change_root(vertex, child);
walk(child, vertex);
change_root(child, vertex);
}
}
// Initialize data structures with respect to the initial root `root`
walk(root, -1);
Problems