Unfortunately, this isn't very easy to explain with plaintext only...
v9 and v8 store only the z value (in wow and mangos, z is height). It is the same in the client (but for rendering they compute xy values and tessellate)
In the server, the triangle vertices' xy values aren't needed to calculate height - as seen in GridMap::getHeightFromFloat(float,float), the player position and triangle position are translated to {0,0}, and the calculation is done on a unit square (the player position is adjusted to be relative to the corners of a 1x1 square).
If you care to render the terrain, you should probably look at the TerrainBuilder class from mmaps redux, in contrib/mmap/src/. (shameless plug )
As I said above, the server has the same data that the client has. Each vertex is only 2 'yards' away from another vertex, which ends up being fairly smooth in appearance. It's not super high resolution, but you don't 'snap' to a terrain mesh vertex when you want height - you calculate the z value of the position on the surface of a triangle.
I should mention that the terrain height calculation isn't ray intersection - there is no mystery about which triangle will be hit, so we don't need to trace a ray through polygon soup.
Ray intersection comes in the form of the vmap, which stores data for buildings, rocks, trees, fences, platforms, boats, and other static doodads. While the terrain may be viewed as 2.5d (it is 3d, but it never overlaps itself so it is easier to represent and handle), objects in the vmap are fully 3d (they can be round, get stacked on top of other objects, intersect other objects, etc). A ray can intersect multiple triangles, and with a naive implementation we have to test all triangles to find which ones.
The BIH (Bounding Interval Hierarchy) is a tree for space-partitioning 3d scenes - their purpose is to let us do as few intersection tests as possible. The nodes in the BIH are essentially bounding boxes for all models in child nodes - if your ray doesn't collide with a node's bounding box, you can prune all of the geometry under that node from the search space. [if any of this is wrong, I apologize - from descriptions, BIH and BVH sound exactly alike. Maybe Lynx3d can help ]