Could you say us more about GetTerrainHeight function?
As far as I can read, you are reading terrain height directly - is it stored in an array or something?
Try to interpolate terrain height between adjacent points as your character position can easily be between two or more data points (if I understood your code right).
UPD:
Try to lerp between current camera position and calculated camera position instead of immediately assigning it:
this.position = Vector3.Lerp(this.position, tmp, 0.05f);
0.05f is the threshold by what percent (in range from 0.0f to 1.0f) you want to move towards target. Calibrate it or even introduce GameTime to make smoothing independent from your framerate.