有两种表现形式,第一种是邻接矩阵,是一个二维布尔数组,表示节点x和y是否相邻;第二种是临界表,表示每个节点的邻居节点,好处是占用空间少,但缺点是无法快速判断两个节点是否相邻。
遍历图和树一样,只不过因为图可能是有环的,所以需要一个visited数组来表示是否遍历过这个节点,而树直接判断是不是null就可以
dfs(){
针对这个节点的操作。
判断是否到终点
if(visited[s])return;
visited[s]=true;
for(TreeNode neighbor:gragh.neighbors()){
dfs(neighbor);
}
针对这个节点的撤销操作。
visited[s]=true;为什么需要把这个操作放到外面,而回溯放到里面,因为这里关注的是每一个节点的遍历,而回溯关注的是树枝,而不是节点,所以回溯里面都不用考虑头结点。
}
class Solution {
List<List<Integer>> res=new ArrayList<List<Integer>>();
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
List<Integer> path=new ArrayList<Integer>();
dfs(graph,0,path);
return res;
}
public void dfs(int[][] graph,int s,List<Integer> path){
path.add(s);
if(graph.length-1==s){
res.add(new ArrayList<Integer>(path));
}
for(int i=0;i<graph[s].length;i++){
dfs(graph,graph[s][i],path);
}
path.remove(path.size()-1);
}
}