Encryption is essentially a function, f(x), that sends plaintext, x, to encrypted text, f(x).
The public key is the recipy on how to perform f, and the private key is essentially the inverse of f.
Note, the only assumption so far on f, is that it has an inverse, which is hard to find given only f.
Ok, now, a homeomorphic crypto algorithm f has the following additional properties:
f(x+y) = f(x) (+) f(y),
f(x*y) = f(x) (*) f(y),
where (+) and (*) are some mathematical binary operators, that are known.
Thus, if I know f(x), f(y), I just perform (+) on these two, and arrive at f(x+y).
Notice, I did not need to know x or y, the plaintext data!
The trouble is, finding a crypto with good strength with both (+) and (*) is hard. (Finding only (*) is easy for RSA-like cryptos).
Now, for this to be useful, (+) and (*) should not be too slow to perform in practice.
Now, why both + and * ? Well, these operators alone can, when composed together, give any other function:
Wikipedia:
Using such a scheme, any circuit can be homomorphically evaluated, effectively allowing the construction of programs which may be run on encryptions of their inputs to produce an encryption of their output.