Zcash - where are treestates stored? Where are the treestates stored?
In other words, when a JoinSplit transaction is being validated, where is the anchor being checked?
A look at https://github.com/zcash/zcash/blob/master/src/primitives/block.h brings me to conclude that the commitments (i.e., notes) merkle-tree is not stored in the block-header.
Is it in a LevelDB database?
What is the data-structure it uses for storing the mapping of trees roots for blocks?

Any answer with a specific reference to code will be very appreciated.
You are correct that the Sprout commitment tree root / anchor is not stored in the block header. It is calculated by each node when a block arrives, and is stored in the block index.

The Sapling commitment tree root is stored in the block header (in what was the hashReserved field); nodes check this against the block contents and reject blocks with an invalid root in the header. This will make shielded address support significantly easier to implement for light clients.

The mappings from Sprout and Sapling tree roots to the IncrementalMerkleTrees themselves are stored in the coins database, and can be accessed wherever you have a CCoinsView.