-
给你一棵二叉树的根节点 root ,返回所有重复的子树 。
-
对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是重复的。
1
/ \
2 3
/ / \
4 2 4
/
4
输入:root = [1,2,3,4,null,2,4,null,null,4]
输出:[[2,4],[4]]
输入:root = [2,1,1]
输出:[[1]]
输入:root = [2,2,2,3,null,3,null]
输出:[[2,3],[3]]
题解
- 遍历树的每个节点,将节点子树按照先序或后续遍历序列化成字符串,作为哈希表的键。哈希值为出现次数。
code
/**
* 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 {
private:
unordered_map<string,int> mymap;
vector<TreeNode*> ans;
public:
string dfs(TreeNode* node){
if(node==nullptr) return "";
//先序化成字符串,注:中序遍历,【2,2,null】和【2,null,2】的返回是相同的,所以无法用于序列化
string key=to_string(node->val)+" "+dfs(node->left)+" "+dfs(node->right);
mymap[key]++;
if(mymap[key]==2) ans.push_back(node);
return key;
}
vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
dfs(root);//遍历树的每一个节点
return ans;
}
};