【算法&面试】DFS深度优先搜索,回溯套路

拿一道题
力扣面试题 04.09. 二叉搜索树序列

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素) {
        处理结点;
        backtracking(路径,选择列表)); // 递归
        回溯,撤销处理结果;
    }
}

力扣里面的图
在这里插入图片描述
下面的算法中,level是候选结点数组,path是当前路径。

package likou.jindian;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: Tangxz
 * @email: 1171702529@qq.com
 * @cate: 2020/12/18 09:35
 */
public class _04_09 {
    List<List<Integer>> res = new ArrayList<>();

    public List<List<Integer>> BSTSequences(TreeNode root) {
        if (root == null) {
            res.add(new ArrayList());
            return res;
        }
        //下一个可选择的结点集合
        ArrayDeque<TreeNode> level = new ArrayDeque<>();
        //当前遍历过的节点值集合,当前答案需要的每一个子集合
        ArrayDeque<Integer> path = new ArrayDeque<>();
		//当前有一个选择,root
        level.add(root);
        //开始dfs遍历
        dfs(level, path);

        return res;
    }

    private void dfs(ArrayDeque<TreeNode> level, ArrayDeque<Integer> path) {
        //如果没有选择了,即遍历完成,就直接存入
        if (level.isEmpty()) {
            res.add(new ArrayList<>(path));
        }

        int n = level.size();
        //当前所有的可能,递归下去。分散下去,深度优先
        for (int i = 0; i < n; i++) {
            TreeNode cur = level.poll();//返回最顶上的
            //下面三行的操作将在最后回退
            path.add(cur.val);
            //把下一步可选择的值,存入level中
            if (cur.left != null) level.add(cur.left);
            if (cur.right != null) level.add(cur.right);
            //
            dfs(level, path);
            //回退候选结点
            if (cur.right != null) level.pollLast();
            if (cur.left != null) level.pollLast();
            path.pollLast(); //把cur给移出path
            //把cur放入候选结点。
            level.add(cur);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值