1. 题目
给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
两棵树重复是指它们具有相同的结构以及相同的结点值。
示例 1:1/ \2 3/ / \4 2 4/4
下面是两个重复的子树:2/4
和4
因此,你需要以列表的形式返回上述重复子树的根结点。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-duplicate-subtrees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. DFS解题
- 将每个节点的前序遍历字符串,存入map的key,value存储对应的root序列数组
- 需要注意空节点,需要返回一个任意的非空字符串区分
class Solution {unordered_map<string, vector<TreeNode*>> m;
public:vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {if (root == NULL)return {};vector<TreeNode*> ans;dfs(root);for(auto it = m.begin(); it != m.end(); ++it){if(it->second.size() != 1)ans.push_back(it->second.front());}return ans;}string dfs(TreeNode* root) {if(root == NULL)return "E";string str = to_string(root->val)+dfs(root->left)+dfs(root->right);//or//string str = dfs(root->left)+dfs(root->right)+to_string(root->val);//但是中序不可以m[str].push_back(root);return str;}
};