I'd like to check if my understanding is correct. This is regarding the purpose of having the Merkle tree structure for all transactions inside a block. Is the only reason it exists so that thin clients can verify that a transaction exists in a block without being told about all the other transactions of that block?
Seems quite complicated to implement that (instead of just concatenation of transactions) for a rather special case. Particularly since the maximum size of a block is not very large - so there isn't really a problem with verifying all the transactions and ensuring that the hash of the block matches up to those.
There is no merkle tree structure inside of blocks. Transactions are just concatenated with each other. The order of concatenation does matter though. It is necessary to verify the merkle root, which is the root node of a merkle tree. The merkle tree is not encoded in the block, rather it is generated on-the-fly using the data in a block in order to verify that the provided merkle root is correct. SPV wallets will often request for a transaction and proof that that transaction is in the block, so a node will provide part of the merkle tree to prove that the transaction is in the block.