has(value) {


        /*
         * `found` keeps track of whether or not the value in question was
         * found in the tree. This variable is used for both the control
         * condition of the loop below and is the return value of this function.
         */ 
        let found = false;

        /*
         * The `current` variable is used to track the item that is being
         * used inside of the loop below. It starts out pointing to
         * `this[root]` and is overwritten inside of the loop.
         */
        let current = this[root];

        /*
         * The loop continues until either the value is found (so `found`
         * is `true`) or the tree has been completely searched
         * (`current` is `null`).
         */
        while (!found && current !== null) {

            // if the value is less than the current node's, go left
            if (value < current.value) {
                current = current.left;

            // if the value is greater than the current node's, go right
            } else if (value > current.value) {
                current = current.right;

            //values are equal, found it!
            } else {
                found = true;
            }
        }

        /*
         * Execution reaches here either because `found` is `true`, or because
         * the tree was completely searched and the value was not found. Either
         * way, the value of `found` is now the result of the search, so just
         * return it.
         */
        return found;
    }
Determines if a given value exists in the tree.
@param {*} value The value to find.
@returns {boolean} True if the value is found in the tree, false if not.