*values(){
        
        /*
         * Traversal is easiest when using a recursive function, so define
         * a helper function here. This function does an in-order traversal
         * of the tree, meaning it yields values in sorted order from 
         * lowest value to highest. It does this by traversing to the leftmost
         * node first, then working its way back up the tree, visiting right nodes
         * along the way.
         * 
         * This function cannot be an arrow function because arrow functions
         * cannot be generators.
         */
        function *traverse(node) {

            // special case: there is no node
            if (node) {

                //traverse the left subtree
                if (node.left !== null) {
                    yield* traverse(node.left);
                }

                // emit the value
                yield node.value;

                //traverse the right subtree
                if (node.right !== null) {
                    yield* traverse(node.right);
                }
            }
        }

        yield* traverse(this[root]);
    }
Create an iterator that returns each node in the tree.
@returns {Iterator} An iterator on the tree.