深度优先遍历DFS
假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
// 用递归进行深度优先遍历
function deepFirstSearch(node) {
const nodeList = [];
if (node !== null) {
nodeList.push(node);
const childNodes = node.children;
Array.from(childNodes).forEach((childNode) => {
nodeList = nodeList.concat(deepTraversal(childNode));
})
}
return nodeList;
}
广度优先遍历 BFS
从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。 如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。
// 用队列进行广度优先遍历
function breadthFirstSearch (node) {
const queue = [];
const nodeList = [];
if (node !== null) {
queue.push(node);
while(queue.length > 0) {
const item = queue.shift();
nodeList.push(item);
Array.from(item.children).forEach((child) => {
queue.push(child);
});
}
}
return nodeList;
}