public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
List<TreeNode> res = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
postOrderTraversal(root, map, res);
return res;
}
public String postOrderTraversal(TreeNode node, Map<String, Integer> map, List<TreeNode> res) {
if (node == null) {
return "#";
}
String leftCode = postOrderTraversal(node.left, map, res);
String rightCode = postOrderTraversal(node.right, map, res);
String curCode = node.val + leftCode + rightCode;
if (map.getOrDefault(curCode, 0) == 1) {
res.add(node);
}
map.put(curCode, map.getOrDefault(curCode, 0) + 1);
return curCode;
}