The difference between the recursive implementation of size and that of put, is that the private recursive method needs to return a reference to the modified subtree. This return Node is needed since new keys are inserted where a null link was. This null link needs to be reset to reference the Node returned by the recursive call.
The implementation:
public void put(int x) { root = put(root, x); } private Node put(Node t, int x) { if (t == null) { return new Node(x); } if (x < t.key) { t.left = put(t.left, x); } else if (x > t.key) { t.right = put(t.right, x); } return t; }