图1.所有可能的路径

有两种表现形式,第一种是邻接矩阵,是一个二维布尔数组,表示节点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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值