1. DFS+BFS初识

38 阅读2分钟
一、DFS 深度优先搜索(Depth-First-Search)

1. 概述 DFS它沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点 这一过程一直进行到已发现从源节点可达的所有节点为止. 如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止. 一般用堆数据结构来辅助实现DFS算法.

2. 深度优先遍历算法步骤 (1) 访问顶点v; (2) 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问 (3) 若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止

3. 代码实现

    /** 
     * 13 
     * / \ 
     * 65 5 
     * / \ \ 
     * 97 25 37 
     * / /\ / 
     * 22 4 28 32 
     */
    
     /**
     * 深度优先遍历,相当于先根遍历
     * 采用非递归实现
     * 需要辅助数据结构:栈
     */
    public void depthOrderTraversal() {
        if (root == null) {
            System.out.println("empty tree");
            return;
        }
        ArrayDeque<TreeNode> stack = new ArrayDeque<TreeNode>();
        stack.push(root);
        while (stack.isEmpty() == false) {
            TreeNode node = stack.pop();
            System.out.print(node.value + " ");
            if (node.right != null) {
                stack.push(node.right);
            }
            if (node.left != null) {
                stack.push(node.left);
            }
        }
        System.out.print("\n");
    }
二、BFS 广度优先搜索(Breadth-First-Search)

1. 概述 BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点. 如果所有节点均被访问,则算法中止。 一般用队列数据结构来辅助实现BFS算法。

2. 广度优先遍历算法步骤 (1) 首先将根节点放入队列中 (2) 从队列中取出第一个节点,并检验它是否为目标。如果找到目标,则结束搜寻并回传结果。否则将它所有尚未检验过的直接子节点加入队列中。 (3) 若队列为空,表示整张图都检查过了,即图中没有欲搜寻的目标。结束搜寻并回传“找不到目标”。 (4) 重复步骤2。

3. 代码实现

    /**
     * 广度优先遍历
     * 采用非递归实现
     * 需要辅助数据结构:队列
     */
    public void levelOrderTraversal() {
        if (root == null) {
            System.out.println("empty tree");
            return;
        }
        ArrayDeque<TreeNode> queue = new ArrayDeque<TreeNode>();
        queue.add(root);
        while (queue.isEmpty() == false) {
            TreeNode node = queue.remove();
            System.out.print(node.value + " ");
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }
        System.out.print("\n");
    }