给你一棵二叉树的根节点 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
List<TreeNode> list = new ArrayList<>();
Map<String, Integer> treeMap = new HashMap<>();
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
//时间复杂度:O(N^2),遍历过程复杂度为O(N),对于每个子树需要构造出与子树同等规模的字符串,复杂度为O(N),所以整体复杂度为O(N^2)
//空间复杂度:O(N)
//如何判断一个节点为根的子树存在重复?
//1.知道自己为根节点的子树长啥样 2.知道其他节点为根节点的子树长啥样
//定义递归函数将二叉树序列化并通过map保存,判断是否存在重复子树
traverse(root);
return list;
}
private String traverse(TreeNode root) {
if (root == null) {
return "#";
}
StringBuilder sb = new StringBuilder();
sb.append(root.val).append("_").append(traverse(root.left)).append(traverse(root.right));
String key = sb.toString();
treeMap.put(key, treeMap.getOrDefault(key, 0) + 1);
if (treeMap.get(key) == 2) {
list.add(root);
}
return key;
}
}