【DFS+哈希表】通过先序遍历获取所有子树的唯一表示(可以通过'#'来表示null,','来分割左右根,达到保留树结构的目的),将树的表示存入哈希表,在便利过程中查询是否在表中即可。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
// 10:00
Map<String, TreeNode> map = new HashMap();
Set<String> set = new HashSet();
List<TreeNode> ans = new ArrayList();
String dfs(TreeNode node) {
if (node == null) return "#";
StringBuilder sb = new StringBuilder();
sb.append(node.val);
sb.append(",");
sb.append(dfs(node.left));
sb.append(",");
sb.append(dfs(node.right));
sb.append(",");
// System.out.println(sb.toString());
if (map.containsKey(sb.toString()) && !set.contains(sb.toString())) {
set.add(sb.toString()); ans.add(node);
}
else map.put(sb.toString(), node);
return sb.toString();
}
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
dfs(root);
return ans;
}
}
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
// 4:38
// DFS序列化 + 哈希表
vector<TreeNode*> ans;
unordered_set<string> s;
unordered_set<string> v;
string dfs(TreeNode* node) {
if (node == nullptr) return "#";
string str = "";
str += to_string(node -> val);
str += ',';
str += dfs(node -> left);
str += ',';
str += dfs(node -> right);
str += ',';
if (s.find(str) != s.end()) {
if (v.find(str) == v.end()) {
ans.emplace_back(node);
v.insert(str);
}
} else {
s.insert(str);
}
return str;
}
vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
dfs(root);
return ans;
}
};