Updated
I have found a better way to get the list of items in "My Drive". Instead of file.list, change.list fits better in our use case.
By setting includeDeleted and includeSubscribed as false, change.list returns a list of changes that holds files that are strictly located in the user's Drive (no Recents and Shared With Me). However, it does include trashed items.
This response is easier to work with since we only have to filter the items labelled as thrashed. It is still not perfect, but at least it saves us the trouble to construct a tree.
Original Answer
The closest way that I have found is to query for 'me' in owners and trashed = false. This query will return all files in "My Drive" and (unfortunately) some files in "Shared With Me". Then you can construct a tree from root folder and drop those that are orphaned.
On the other hand, the cleanest way is to query for 'root' in parents and traverse the tree layer by layer. That's not so efficient though.
Note: query not sharedWithMe or sharedWithMe = false results in 400, otherwise it will be the best solution.