给定一棵二叉树,要求寻找其中重复的子树。如果有重复的,只需返回其中一个子树的根节点。如下面的二叉树,2-4这个子树重复了,则返回2这个节点。
分析:可以使用后序访问的顺序,把访问过的节点的序列依次存入HashMap中,如果后面遇到相同的节点序列,则说明结构和数值都相同。
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
List<TreeNode> list = new ArrayList<TreeNode>();
if(root == null)
return list;
find(root, new HashMap<String, Integer>(), list);
return list;
}
public String find(TreeNode root, HashMap<String, Integer> map, List<TreeNode> list){
if(root == null)
return "#";
String str = root.val + "," + find(root.left, map, list) + "," + find(root.right, map, list);//实际上是后序访问
if(map.getOrDefault(str, 0) == 1) list.add(root); //不能重复
map.put(str, map.getOrDefault(str, 0) + 1);
return str;
}