>the tokenization process changes what is in sentence, however, right?
Yes, null characters are inserted to split the string up into multiple strings.

>the preorder traversal seems to have stopped working...
Well technically it never did work in the first place. The problem is that you're comparing pointers, not the strings that they point to. Maybe something like this instead?
Code:
template< class NODETYPE >
void Tree< NODETYPE >::insertNodeHelper( 
                                        TreeNode< NODETYPE > **ptr, const NODETYPE &value )
{
  // subtree is empty; create new TreeNode containing value
  if ( *ptr == 0 )  
    *ptr = new TreeNode< NODETYPE >( value );

  else  // subtree is not empty

    // data to insert is less than data in current node
    if ( strcmp ( value, ( *ptr )->data ) < 0 )
      insertNodeHelper( &( ( *ptr )->leftPtr ), value );

    else

      // data to insert is greater than data in current node
      if ( strcmp ( value, ( *ptr )->data ) > 0 )
        insertNodeHelper( &( ( *ptr )->rightPtr ), value );

      else  // duplicate data value ignored
        cout << value << " dup" << endl;

} // end function insertNodeHelper
>How would you tokenize the sentence string?
A stringstream is probably the simplest way. This has come up before, so you can probably find code (probably from me) for tokenizing a std::string.