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);
}
}
规则:
广度优先搜索为层次结点的遍历,可转化为队列的入队、出队操作。