Skip to content

Commit 6fe7df3

Browse files
committed
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
Lines changed: 42 additions & 18 deletions
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
functioninitCallbacks(callbacks={}){
14-
constinitiatedCallback=callbacks;
19+
// Init empty callbacks object.
20+
constinitiatedCallbacks={};
1521

22+
// Empty callback that we will use in case if user didn't provide real callback function.
1623
conststubCallback=()=>{};
17-
constdefaultAllowTraversal=()=>true;
24+
// By default we will allow traversal of every node
25+
// in case if user didn't provide a callback for that.
26+
constdefaultAllowTraversalCallback=()=>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-
returninitiatedCallback;
33+
// Returned processed list of callbacks.
34+
returninitiatedCallbacks;
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
exportfunctiondepthFirstSearchRecursive(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
exportdefaultfunctiondepthFirstSearch(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+
constprocessedCallbacks=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)