You should indeed be able to do this using the Catalog
table in the ReportServer database. It contains a column Content
with the report definition in binary, which you can convert to XML with a query.
The resulting XML can then further be queried. I personally don't have much experience with this, but with just glancing at the query method and basic XQuery expressions I could easily come up with this:
DECLARE @rdl XML
SELECT @rdl = CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content))
FROM Reportserver.dbo.Catalog C
WHERE C.ItemID = 'AAAAAAAA-1111-BBBB-2222-CCCCCCCCCCCC' -- Use your ID ;-)
SELECT @rdl.query('//*:Subreport')
Which would give a result similar to this:
<p1:Subreport xmlns:p1="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition" Name="SubReport">
<p1:ReportName>SomeAwesomeSubreport</p1:ReportName>
<p1:Parameters>
<p1:Parameter Name="Param1">
<p1:Value>=Fields!MyGreatField.Value</p1:Value>
</p1:Parameter>
</p1:Parameters>
<p1:KeepTogether>true</p1:KeepTogether>
<p1:Height>2.25cm</p1:Height>
<p1:Width>21cm</p1:Width>
<p1:Style />
</p1:Subreport>
From there it's still some work to get to a query that creates the "map/tree structure" you're after, but it should get you startedl. Unfortunately my SQL-fu is not yet awesome enough to just easily spit out that code, but I welcome you or anyone who's able to do so to add it to this answer.
Hope this helps.