Binary Search Tree delete function
public Node findSmallest(Node start) {
    //This is so in the main method, I can call findSmallest and pass in
    //null to search the whole tree. Because in main, I won't have reference
    //to the root. I have the start parameter so I can specifiy where to
    //start the search, because of the way I am dealing with deleting
    //a node with 2 children. See above.
    Node smallest = start == null ? root : start;

    while(smallest.getLeftNode() != null) {
        smallest = smallest.getLeftNode();
    }
    return smallest;
}



I would break this into two methods:  

public Node findSmallest() {
    return findSmallest(root);
}

private Node findSmallest(Node candidate) {
    // I have the start parameter so I can specify where to
    // start the search, because of the way I am dealing with deleting
    // a node with 2 children. See above.
    while (candidate.getLeftNode != null) {
        candidate = candidate.getLeftNode();
    }

    return candidate;
}


Now your external caller isn't asked to pass information that it doesn't have.  And you don't have to check whether the method is being called internally or externally on every call.  

I prefer the name candidate to smallest for accuracy's sake.  Until the last iteration, it's not the smallest.  It's a candidate to be the smallest on every iteration.  


    }
    //Case 3: If node to be deleted has 2 children.
    else {



I'm not a fan of the half-cuddled else in the first place, but if you have to use it, please use it without separation.  It's bad enough that C-style languages (e.g. Java) do not explicitly end their if/then blocks.  Adding arbitrary content between the then block and the else just makes this worse.  

    }
    else {
        // Case 3: If node to be deleted has 2 children.


Now I can easily see that there is an else.  I don't have to scroll down to the next statement to see if it might be an else.  

Also, there are four cases, not three.  Your case 2 is two cases:  a null left child or a null right.  


    while(data != current.getData() &amp;&amp; current != null) {



This is a bug.  Create a test case where the data is not found and you'll see.