题目:寻找重复的子树
class Solution {
Set<TreeNode> set = new HashSet<>();
Map<String,TreeNode> map = new HashMap<>();
public void preTraverse(TreeNode root){
if (root == null)
return;
examine(root);
if (root.left != null)
preTraverse(root.left);
if (root.right != null)
preTraverse(root.right);
}
public void examine(TreeNode node){
List<Integer> lis = new ArrayList<>();
pre(lis,node);
lis.add(Integer.MAX_VALUE);
mid(lis,node);
//把list转成String
StringBuilder sb = new StringBuilder();
for (Integer li : lis) {
sb.append(li);
}
String s = sb + "";
if (map.containsKey(s)){
this.set.add(map.get(s));
}else {
map.put(s,node);
}
}
public void pre(List myLis,TreeNode node){
myLis.add(node.val);
if (node.left != null)
{
myLis.add(0);
pre(myLis,node.left);
}
if (node.right != null)
{
myLis.add(1);
pre(myLis,node.right);
}
}
public void mid(List myLis,TreeNode node){
if (node.left != null) {
myLis.add(0);
mid(myLis,node.left);
}
myLis.add(node.val);
if (node.right != null)
{
myLis.add(1);
mid(myLis,node.right);
}
}
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
if (root == null){
List<TreeNode> collect = set.stream().collect(Collectors.toList());
return collect;
}
preTraverse(root);
List<TreeNode> collect = set.stream().collect(Collectors.toList());
return collect;
}
}