Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 6fe7df3

Browse files
committedFeb 1, 2019
Add more comments to tree DFS algorithm.
1 parent f08fc37 commit 6fe7df3

File tree

1 file changed

+42
-18
lines changed

1 file changed

+42
-18
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,76 @@
11
/**
2-
* @typedef {Object} Callbacks
3-
* @property {function(node: BinaryTreeNode, child: BinaryTreeNode): boolean} allowTraversal -
4-
* Determines whether DFS should traverse from the node to its child.
2+
* @typedef {Object} TraversalCallbacks
3+
*
4+
* @property {function(node: BinaryTreeNode, child: BinaryTreeNode): boolean} allowTraversal
5+
* - Determines whether DFS should traverse from the node to its child.
6+
*
57
* @property {function(node: BinaryTreeNode)} enterNode - Called when DFS enters the node.
8+
*
69
* @property {function(node: BinaryTreeNode)} leaveNode - Called when DFS leaves the node.
710
*/
811

912
/**
10-
* @param {Callbacks} [callbacks]
11-
* @returns {Callbacks}
13+
* Extend missing traversal callbacks with default callbacks.
14+
*
15+
* @param {TraversalCallbacks} [callbacks] - The object that contains traversal callbacks.
16+
* @returns {TraversalCallbacks} - Traversal callbacks extended with defaults callbacks.
1217
*/
1318
function initCallbacks(callbacks = {}) {
14-
const initiatedCallback = callbacks;
19+
// Init empty callbacks object.
20+
const initiatedCallbacks = {};
1521

22+
// Empty callback that we will use in case if user didn't provide real callback function.
1623
const stubCallback = () => {};
17-
const defaultAllowTraversal = () => true;
24+
// By default we will allow traversal of every node
25+
// in case if user didn't provide a callback for that.
26+
const defaultAllowTraversalCallback = () => true;
1827

19-
initiatedCallback.allowTraversal = callbacks.allowTraversal || defaultAllowTraversal;
20-
initiatedCallback.enterNode = callbacks.enterNode || stubCallback;
21-
initiatedCallback.leaveNode = callbacks.leaveNode || stubCallback;
28+
// Copy original callbacks to our initiatedCallbacks object or use default callbacks instead.
29+
initiatedCallbacks.allowTraversal = callbacks.allowTraversal || defaultAllowTraversalCallback;
30+
initiatedCallbacks.enterNode = callbacks.enterNode || stubCallback;
31+
initiatedCallbacks.leaveNode = callbacks.leaveNode || stubCallback;
2232

23-
return initiatedCallback;
33+
// Returned processed list of callbacks.
34+
return initiatedCallbacks;
2435
}
2536

2637
/**
27-
* @param {BinaryTreeNode} node
28-
* @param {Callbacks} callbacks
38+
* Recursive depth-first-search traversal for binary.
39+
*
40+
* @param {BinaryTreeNode} node - binary tree node that we will start traversal from.
41+
* @param {TraversalCallbacks} callbacks - the object that contains traversal callbacks.
2942
*/
3043
export function depthFirstSearchRecursive(node, callbacks) {
44+
// Call the "enterNode" callback to notify that the node is going to be entered.
3145
callbacks.enterNode(node);
3246

33-
// Traverse left branch.
47+
// Traverse left branch only if case if traversal of the left node is allowed.
3448
if (node.left && callbacks.allowTraversal(node, node.left)) {
3549
depthFirstSearchRecursive(node.left, callbacks);
3650
}
3751

38-
// Traverse right branch.
52+
// Traverse right branch only if case if traversal of the right node is allowed.
3953
if (node.right && callbacks.allowTraversal(node, node.right)) {
4054
depthFirstSearchRecursive(node.right, callbacks);
4155
}
4256

57+
// Call the "leaveNode" callback to notify that traversal
58+
// of the current node and its children is finished.
4359
callbacks.leaveNode(node);
4460
}
4561

4662
/**
47-
* @param {BinaryTreeNode} rootNode
48-
* @param {Callbacks} [callbacks]
63+
* Perform depth-first-search traversal of the rootNode.
64+
* For every traversal step call "allowTraversal", "enterNode" and "leaveNode" callbacks.
65+
* See TraversalCallbacks type definition for more details about the shape of callbacks object.
66+
*
67+
* @param {BinaryTreeNode} rootNode - The node from which we start traversing.
68+
* @param {TraversalCallbacks} [callbacks] - Traversal callbacks.
4969
*/
5070
export default function depthFirstSearch(rootNode, callbacks) {
51-
depthFirstSearchRecursive(rootNode, initCallbacks(callbacks));
71+
// In case if user didn't provide some callback we need to replace them with default ones.
72+
const processedCallbacks = initCallbacks(callbacks);
73+
74+
// Now, when we have all necessary callbacks we may proceed to recursive traversal.
75+
depthFirstSearchRecursive(rootNode, processedCallbacks);
5276
}

0 commit comments

Comments
 (0)
Please sign in to comment.