/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func findDuplicateSubtrees(root *TreeNode) (res []*TreeNode) {
	m := make(map[string]int)
	helper(root, m, &res)
	return res
}

func helper(root *TreeNode, m map[string]int, res *[]*TreeNode) string {
	if root == nil {
		return "#"
	}
	path := helper(root.Left, m, res) + " " + helper(root.Right, m, res) + " " + strconv.Itoa(root.Val)
	if m[path] == 1 {
		*res = append(*res, root)
	}
	m[path]++
	return path
}