Source: traverseTree.js

/**
 * Code for traversing: 
 * https://code.tutsplus.com/articles/data-structures-with-javascript-tree--cms-23393 
 * 
 * @param {*} tree - tree to be traversed
 * @param {*} currentNode - current node while recursing
 * @param {*} callbackEntering - callback function called before entering the current node
 * @param {*} callbackLeaving - callback function called after leaving the current node
 * @param {*} level - counts recursion level, may be used by callback functions
 */
function recurseNode(tree, currentNode, callbackEntering, callbackLeaving, level) {
    callbackEntering(level, currentNode);
    if (currentNode.children) {
        var num_of_children = currentNode.children.length;
        level++;
        for (var i = 0; i < num_of_children; i++) {
            var childKey = currentNode.children[i];
            var child = tree[childKey];
            recurseNode(tree, child, callbackEntering, callbackLeaving, level);
        }
        level--;
    }
    callbackLeaving(level, currentNode);
}

/**
 * 
 * @param {*} tree -  keybased tree object
 * @param {*} callback - function callbackEntering(level, currentNode)
 * called when entering current node
 * direction root to leafs ist used by displaying the tree in common manner
 */
 export function traverseRootToLeafs(tree, callback) {
    var emptyFunc = function () {};
    var currentNode = tree['root'];
    recurseNode(tree, currentNode, callback, emptyFunc, 0);
}

/**
 * 
 * @param {*} tree  -  keybased tree object
 * @param {*} callbackEnter   - function callbackEnter(level, currentNode)
 * called when entering current node
 * @param {*} callbackLeave  - function callbackLeave(level, currentNode)
 * called when leaving current node
 */
export function traverseRootToLeafs_EnterLeave(tree, callbackEnter, callbackLeave) {
    var currentNode = tree['root'];
    recurseNode(tree, currentNode, callbackEnter, callbackLeave, 0);
}

/**
 * 
 * @param {*} tree -  keybased tree object
 * @param {*} callback - function callbackLeaving(level, currentNode)
 * called when leaving current node
 * direction "leafs to root" is used by evaluating an arithmetic tree
 */
 export function traverseLeafsToRoot(tree, callback) {
    var emptyFunc = function () {};
    // var emptyFunc = null; //causes TypeError
    var currentNode = tree['root'];
    recurseNode(tree, currentNode, emptyFunc, callback, 0);
}