function depthFirstSearch(rootNode, callbacks) {
  // In case if user didn't provide some callback we need to replace them with default ones.
  const processedCallbacks = initCallbacks(callbacks);

  // Now, when we have all necessary callbacks we may proceed to recursive traversal.
  depthFirstSearchRecursive(rootNode, processedCallbacks);
}
Perform depth-first-search traversal of the rootNode.
For every traversal step call "allowTraversal", "enterNode" and "leaveNode" callbacks.
See TraversalCallbacks type definition for more details about the shape of callbacks object.

@param {BinaryTreeNode} rootNode - The node from which we start traversing.
@param {TraversalCallbacks} [callbacks] - Traversal callbacks.