public BasicTreeNode<T> insert(T newValue)
    {
        if (this.root == null) {
            this.root = createNode(newValue);
            ++this.size;
            return this.root;
        }
        
        // Our data structure doesn't hold nulls
        if (newValue == null) {
            return null;
        }
        
        BasicTreeNode<T> current = this.root;
        
        boolean done = false;
        while (!done) {
            int comparison = ObjectUtils.compare(current.getValue(), newValue);
            if (comparison == 0) {
                done = true;
            } else if (comparison > 0) {
                // new value is smaller than current value
                if (current.getLeftChild() == null) {
                    ++this.size;
                    BasicTreeNode<T> newNode = createNode(newValue);
                    current.setLeftChild(newNode);
                    updateHeight(current);
                    current = newNode;
                    done = true;
                } else {
                    current = current.getLeftChild();
                }
            } else {
                // new value is greater than current value
                if (current.getRightChild() == null) {
                    ++this.size;
                    BasicTreeNode<T> newNode = createNode(newValue);
                    current.setRightChild(newNode);
                    updateHeight(current);
                    current = newNode;
                    done = true;
                } else {
                    current = current.getRightChild();
                }
            }
        }
        
        return current;
    }