Spell-checking application in C++
using namespace std; Never do this
Prefer using \n over std::endl as the latter flushes the buffer which is rarely needed and can be detrimental to performance.
const your arguments whenever possible. More about const correctness
* and &amp; are considered to be part of the type in C++ so prefer writing int&amp; foo instead of int &amp;foo. Likewise for *.
Never omit optional braces as doing so will lead to bugs eventually.
Reaching the end of main will automatically return 0 so you can remove the trailing return 0
Don't initialize more than one variable per line.
I like that you use the prefix operator. Your naming is pretty good too so why are you doing this?

// Close the file
file.close();


or this

// Loop through arguments
for (int i = 0; i &lt; argc; ++i)


Your comments are completely superfluous and can all be removed.
What is this?

// Free the memory
token = nullptr;
delim = nullptr;
delete token;
delete delim;



delete is only used after a matching new. It feels like you misunderstood something in regard to memory managment. Read up on this again.
new
delete
memory managment


BinarySearchTree *tree = new BinarySearchTree();


I don't know how this is implemented but a line like that looks like something from Java. Do you really need to put this on the heap?


Personally I think the word splitting could be done rather elegantly in regex. However many people are quite opposed to using regex. I've also read that in the past regex performance in C++ was rather poor but it might be worth measuring to see if it's within acceptable limits for your use-case.  


Regex example:

std::regex rx{R"(([^ .,?!:;/\"\'\n\t]+))"};
auto data_begin = std::sregex_iterator(data.begin(), data.end(), rx);
auto data_end = std::sregex_iterator();
for (std::sregex_iterator it = data_begin; it != data_end; ++it) {
    // do something with words here
}