(算法)DFS(深度优先)与BFS(广度优先)

155 阅读1分钟

DFS与二叉树

解释:

深度优先搜索的核心思想,是试图穷举所有的完整路径。
二叉树的先序遍历正是深度优先搜索思想的递归实现。

编码:

/**
* @params {Node} root
* @return void
*/
const preorder = function(root){
    //递归边界
    if(!root)n return;
    
    const rootVal = root.val;
    console.log('当前遍历的结点值是:', rootVal);
    //左子树
    preorder(root.left);
    //右子树
    preorder(root.right)
}

规则:

深度优先搜索的过程可以转化为一系列的入栈、出栈操作。

BFS与二叉树

解释:

广度优先搜索每次以“广度”为第一要务、一层一层地扫描。
已遍历过的结点在后续的遍历中会被丢弃掉、后续可直接抵达的结点,是需要被记录下来。

伪代码:

/**
* @params {Node} root 入口结点
* @return void
*/
const BFS = function(root){
    //队列
    const queue = [];
    //入队
    queue.push(root);
    
    //层层搜索(队)
    while(queue.length){
        //出队并保存当前结点信息
        const top = queue.shift();
        
        // 结点多时可使用for循环
        for(遍历top可达到的结点信息){
            //入队可抵达的结点信息
            queue.push(top可抵达元素)
        }
    }
}

规则:

丢弃已访问的结点、记录新观察到的结点,符合“先进先出”的原则,为队列特性。

二叉树的层序遍历

结构:

const root = {
  val: "A",
  left: {
    val: "B",
    left: {
      val: "D"
    },
    right: {
      val: "E"
    }
  },
  right: {
    val: "C",
    right: {
      val: "F"
    }
  }
};

编码:

/**
* @params {Node} root 入口结点
* @return void
*/
const BFS = function(root){
    //队列
    const queue = [];
    //入队
    queue.push(root);
    
    //层层搜索(队)
    while(queue.length){
        //出队并保存当前结点信息
        const top = queue.shift();
        // 访问 top
        console.log(top.val)
        
        if(top.left) queue.push(top.left);
        if(top.right) queue.push(top.right);
    }
}

规则:

广度优先搜索为层次结点的遍历,可转化为队列的入队、出队操作。