多叉树的遍历

    1. /* 多叉树遍历框架 */
    2. void traverse(TreeNode root) {
    3. if (root == null) return;
    4. for (TreeNode child : root.children) {
    5. traverse(child);
    6. }
    7. }

    图和多叉树最大的区别是,图是可能包含环的,你从图的某一个节点开始遍历,有可能走了一圈又回到这个节点。
    所以,如果图包含环,遍历框架就要一个 visited 数组进行辅助:

    1. // 记录被遍历过的节点
    2. boolean[] visited;
    3. // 记录从起点到当前节点的路径
    4. boolean[] onPath;
    5. /* 图遍历框架 */
    6. void traverse(Graph graph, int s) {
    7. if (visited[s]) return;
    8. // 经过节点 s,标记为已遍历
    9. visited[s] = true;
    10. // 做选择:标记节点 s 在路径上
    11. onPath[s] = true;
    12. for (int neighbor : graph.neighbors(s)) {
    13. traverse(graph, neighbor);
    14. }
    15. // 撤销选择:节点 s 离开路径
    16. onPath[s] = false;
    17. }