Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit6fe7df3

Browse files
committed
Add more comments to tree DFS algorithm.
1 parentf08fc37 commit6fe7df3

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)

[8]ページ先頭

©2009-2025 Movatter.jp