This problem can be easily solved using recursive way.

class Solution {
fun leafSimilar(root1: TreeNode?, root2: TreeNode?): Boolean {
tailrec fun findLeaves(node: TreeNode?, collector: MutableList<TreeNode>){
if(node == null) return

if(node?.left == null && node?.right == null){
return
}

findLeaves(node?.left, collector)
findLeaves(node?.right, collector)
}

var seq1 = mutableListOf<TreeNode>()
var seq2 = mutableListOf<TreeNode>()

findLeaves(root1, seq1)
findLeaves(root2, seq2)

return seq1.filterIndexed {index, i -> i.val != seq2[index].val}.isEmpty()
}
}


The idea is to go through each of the nodes recursively and if the node’s left and right children are both null, then the node is a leaf. We then use a collector to collect these nodes.

After we collected all the leaves for both trees, we compare them one by one to verify if their contents are both equal.

Runtime: 140 ms, faster than 94.44% of Kotlin online submissions for Leaf-Similar Trees.
Memory Usage: 32 MB, less than 100.00% of Kotlin online submissions for Leaf-Similar Trees.