算法:深度优先搜索(DFS)

  created  by  鱼鱼 {{tag}}
创建于 2020年06月25日 23:34:45 最后修改于 2020年06月27日 23:17:52

    在算法:广度优先搜索(BFS)(最短路径)中,我们提到了按照广度优先遍历的搜索方式,使用队列作为常规的搜索方式,与之相对应的为深度优先搜索(DFS)。如果说BFS对应着树结构的前中后序遍历。但是DFS相对解法较为多元一些,有些时候不得不使用递归进行求解。同时,有很多求解只是进行图的遍历,不关心是广度还是深度优先,其解都是相同的。

    二叉树的基本遍历:前中后序

    在这里我们暂且不讨论的基于栈而是侧重基于递归的遍历实现。

    对于二叉树,最常见的遍历方式有前序(又称 先序)遍历、中序遍历、后序遍历、层次遍历。前中后序只为取得的值先后顺序不同,即递归有先后。依赖栈实现的的深度优先是前序遍历。以下是一个二叉树的前序遍历代码实现:

//public class  TreeNode<T> {
//    public T val;
//    public TreeNode<T> left;
//    public TreeNode<T> right;
//    public TreeNode(T x) { val = x; }
//}
public static void main(String[] args){
    TreeNode<Integer> tree =  …………;
    inorderTraversal(tree);
}
private static List<Integer> inorderTraversal(TreeNode<Integer> root){
    List<Integer> vals = new ArrayList<>();
    inorder(root, vals);
    return vals;
}
private static  void inorder(TreeNode<Integer> node, List<Integer> vals) {
    if (node == null) return;
    //前序对应根-左-右
    //定义遍历行为是按顺序输出
    vals.add(node.val);
    inorder(node.left, vals);
    inorder(node.right, vals);
    //如果改成这样 左根右 就是中序遍历
    //inorder(node.left, vals);
    //vals.add(node.val);
    //inorder(node.right, vals);
}

    这种递归遍历是DFS的基础,譬如,求二叉树的最大深度(当然也可以用BFS实现)

评论区
评论
{{comment.creator}}
{{comment.createTime}} {{comment.index}}楼
评论

算法:深度优先搜索(DFS)

算法:深度优先搜索(DFS)

    在算法:广度优先搜索(BFS)(最短路径)中,我们提到了按照广度优先遍历的搜索方式,使用队列作为常规的搜索方式,与之相对应的为深度优先搜索(DFS)。如果说BFS对应着树结构的前中后序遍历。但是DFS相对解法较为多元一些,有些时候不得不使用递归进行求解。同时,有很多求解只是进行图的遍历,不关心是广度还是深度优先,其解都是相同的。

    二叉树的基本遍历:前中后序

    在这里我们暂且不讨论的基于栈而是侧重基于递归的遍历实现。

    对于二叉树,最常见的遍历方式有前序(又称 先序)遍历、中序遍历、后序遍历、层次遍历。前中后序只为取得的值先后顺序不同,即递归有先后。依赖栈实现的的深度优先是前序遍历。以下是一个二叉树的前序遍历代码实现:

//public class  TreeNode<T> {
//    public T val;
//    public TreeNode<T> left;
//    public TreeNode<T> right;
//    public TreeNode(T x) { val = x; }
//}
public static void main(String[] args){
    TreeNode<Integer> tree =  …………;
    inorderTraversal(tree);
}
private static List<Integer> inorderTraversal(TreeNode<Integer> root){
    List<Integer> vals = new ArrayList<>();
    inorder(root, vals);
    return vals;
}
private static  void inorder(TreeNode<Integer> node, List<Integer> vals) {
    if (node == null) return;
    //前序对应根-左-右
    //定义遍历行为是按顺序输出
    vals.add(node.val);
    inorder(node.left, vals);
    inorder(node.right, vals);
    //如果改成这样 左根右 就是中序遍历
    //inorder(node.left, vals);
    //vals.add(node.val);
    //inorder(node.right, vals);
}

    这种递归遍历是DFS的基础,譬如,求二叉树的最大深度(当然也可以用BFS实现)


算法:深度优先搜索(DFS)2020-06-27鱼鱼

{{commentTitle}}

评论   ctrl+Enter 发送评论