mirror of
https://github.com/trekhleb/javascript-algorithms.git
synced 2025-12-08 19:06:00 +00:00
59 lines
1.8 KiB
JavaScript
59 lines
1.8 KiB
JavaScript
import Queue from '../../../data-structures/queue/Queue';
|
|
|
|
/**
|
|
* @typedef {Object} Callbacks
|
|
* @property {function(node: BinaryTreeNode, child: BinaryTreeNode): boolean} allowTraversal -
|
|
* Determines whether DFS should traverse from the node to its child.
|
|
* @property {function(node: BinaryTreeNode)} enterNode - Called when DFS enters the node.
|
|
* @property {function(node: BinaryTreeNode)} leaveNode - Called when DFS leaves the node.
|
|
*/
|
|
|
|
/**
|
|
* @param {Callbacks} [callbacks]
|
|
* @returns {Callbacks}
|
|
*/
|
|
function initCallbacks(callbacks = {}) {
|
|
const initiatedCallback = callbacks;
|
|
|
|
const stubCallback = () => {};
|
|
const defaultAllowTraversal = () => true;
|
|
|
|
initiatedCallback.allowTraversal = callbacks.allowTraversal || defaultAllowTraversal;
|
|
initiatedCallback.enterNode = callbacks.enterNode || stubCallback;
|
|
initiatedCallback.leaveNode = callbacks.leaveNode || stubCallback;
|
|
|
|
return initiatedCallback;
|
|
}
|
|
|
|
/**
|
|
* @param {BinaryTreeNode} rootNode
|
|
* @param {Callbacks} [originalCallbacks]
|
|
*/
|
|
export default function breadthFirstSearch(rootNode, originalCallbacks) {
|
|
const callbacks = initCallbacks(originalCallbacks);
|
|
const nodeQueue = new Queue();
|
|
|
|
// Do initial queue setup.
|
|
nodeQueue.enqueue(rootNode);
|
|
|
|
while (!nodeQueue.isEmpty()) {
|
|
const currentNode = nodeQueue.dequeue();
|
|
|
|
callbacks.enterNode(currentNode);
|
|
|
|
// Add all children to the queue for future traversals.
|
|
|
|
// Traverse left branch.
|
|
if (currentNode.left && callbacks.allowTraversal(currentNode, currentNode.left)) {
|
|
nodeQueue.enqueue(currentNode.left);
|
|
}
|
|
|
|
// Traverse right branch.
|
|
if (currentNode.right && callbacks.allowTraversal(currentNode, currentNode.right)) {
|
|
nodeQueue.enqueue(currentNode.right);
|
|
}
|
|
|
|
callbacks.leaveNode(currentNode);
|
|
}
|
|
}
|