У вас проблема в решении в том, что вы сравниваете 2 обхода. Это неверно для, как вам уже приводили в пример, этих двух деревьев:
1
\
2
\
3
3
/
2
/
1
Тут оба обхода вернут 1,2,3.
Можно в вашем решении добавлять всякие разделители при переходе влево-вправо-вверх. Вставить всякие yeild -1 и другие значения перед походом влево, выводом собственно элемента и походом вправо.
Но есть лучшее решение, через DFS или BFS: вы делайте обход одновременно на двух деревьях. Т.е. у вас параметр функции dfs или в очереди в bfs лежат сразу 2 вершины - по одной из каждого дерева. Вы проверяете, что у них значения одинаковые и что у них у обеих одновременно есть или нет левого и правого ребенка. Потом вызываетесь/кладете в очередь одновременно левых детей и одновременно правых детей. Если в процессе обхода вершины оказались разными, или где-то есть ребенок, а где-то нет - то деревья не равны.
Очень логично реализовывается в виде DFS (ниже псевдокод):
Equals(t1, t2):
// обработать случай null одного или обоих деревьев.
return t1.v == t2.v && Equals(t1.left, t2.left) && Equals(t1.right, t2.right)
Все предельно логично - 2 дерева равны, если у них равны корни, левые поддеревья и правые поддеревья.
Кстати, ваше решение, если его исправить, тоже будет за O(n).