多叉树的遍历
/* 多叉树遍历框架 */void traverse(TreeNode root) {if (root == null) return;for (TreeNode child : root.children) {traverse(child);}}
图和多叉树最大的区别是,图是可能包含环的,你从图的某一个节点开始遍历,有可能走了一圈又回到这个节点。
所以,如果图包含环,遍历框架就要一个 visited 数组进行辅助:
// 记录被遍历过的节点boolean[] visited;// 记录从起点到当前节点的路径boolean[] onPath;/* 图遍历框架 */void traverse(Graph graph, int s) {if (visited[s]) return;// 经过节点 s,标记为已遍历visited[s] = true;// 做选择:标记节点 s 在路径上onPath[s] = true;for (int neighbor : graph.neighbors(s)) {traverse(graph, neighbor);}// 撤销选择:节点 s 离开路径onPath[s] = false;}
