深度优先遍历和广度优先遍历
程序员文章站
2022-05-21 19:25:38
...
深度优先遍历
- 则从某个顶点v出发,首先访问该顶点然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。若此时有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
JS代码实现写了两个,一个是用递归的方式,一个是用while的方式
- 深度优先 循环
const deepTraversalLoop = (node, nodeList = []) => {
if (node) {
nodeList.push(node);
let item = node.children;
for (let i = 0; i < item.length; i++) {
deepTraversalLoop(item[i], nodeList);
}
}
return nodeList
}
- 深度优先 while
const deepTraversalWhile = (node) => {
let nodeList = [];
let stack = [];
if (node) {
stack.push(node);
while (stack.length) {
let item = stack.pop();
nodeList.push(item);
let children = item.children;
for (let i = children.length - 1; i >= 0; i--) {
stack.push(children[i])
}
}
}
return nodeList
}
广度优先遍历
-
顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。 如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。
-
深度优先 while
const widthTraversalWhile = (node) => {
let nodeList = [];
let stack = [];
if (node) {
stack.push(node);
while (stack.length) {
// 每次取第一个作为stack push进去
let item = stack.shift();
nodeList.push(item);
let children = item.children;
for (let i = 0; i < children.length; i++) {
// 对应的child 往后排
stack.push(children[i])
}
}
}
return nodeList
}