No, your states named G1 and G5 are in fact equal by Game.equals.
I've added the first 7 lines of output for both DisplayTree1 and
DisplayTree2 to hw5.html, with the following for DisplayTree2:
[] [](1 next)(level 0): G0
[] [](done)(level 1): G1
[1] [](2 next)(level 1): G2
[1] [](done)(level 2): G3
[1] [2](1 next)(level 2): G4
[1] [2](done)(level 3): G1 <-- first repeated state
[1, 3] [2](done)(level 3): G5
G1 is the state where the game is over and player 2 won. It doesn't matter
to Game's equals method (Easy's equals) how the win was made.
The toString() display shows that the two G1 states were reached in
different ways. We see that two Game objects g1 and g2 can have g1.equals(g2),
but different toString() values, at least if the game is over. What matters
here is the equals result. See the Javadoc for equals.