描述
给你一棵二叉树的根节点 root ,返回所有 重复的子树 。
对于同一类的重复子树,你只需要返回其中任意 一棵 的根结点即可。
如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是 重复 的。
示例 1:
输入:root = [1,2,3,4,null,2,4,null,null,4]
输出:[[2,4],[4]]
示例 2:
输入:root = [2,1,1]
输出:[[1]]
示例 3:
输入:root = [2,2,2,3,null,3,null]
输出:[[2,3],[3]]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-duplicate-subtrees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
C++代码
#include <unordered_map>
#include <vector>
using namespace std;
class Solution {
// 记录所有子树以及出现的次数
unordered_map<string, int> memo;
// 记录重复的子树根节点
vector<TreeNode*> res;
public:
/* 主函数 */
vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
traverse(root);
return res;
}
string traverse(TreeNode* root) {
if (root == nullptr) {
return "#";
}
string left = traverse(root->left);
string right = traverse(root->right);
string subTree = left + "," + right + "," + to_string(root->val);
int freq = memo[subTree];
// 多次重复也只会被加入结果集一次
if (freq == 1) {
res.push_back(root);
}
// 给子树对应的出现次数加一
memo[subTree] = freq + 1;
return subTree;
}
};
Python代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def __init__(self):
self.memo = {}
self.res = []
def findDuplicateSubtrees(self, root: Optional[TreeNode]) -> List[Optional[TreeNode]]:
self.traverse(root)
return self.res
def traverse(self, root):
if not root:
return ""
left = self.traverse(root.left)
right = self.traverse(root.right)
subTree = left + "," + right + "," + str(root.val)
freq = self.memo.get(subTree, 0) # 如果不存在返回0
# 多次重复也只会被加入结果集一次
if freq == 1:
self.res.append(root)
self.memo[subTree] = freq + 1 # 给子树对应的出现次数加一
return subTree