给定一棵二叉树 root,返回所有重复的子树。

    对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。

    如果两棵树具有相同的结构和相同的结点值,则它们是重复的。

    示例 1:
    image.png
    输入: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]]

    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val, left, right) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.left = (left===undefined ? null : left)
    6. * this.right = (right===undefined ? null : right)
    7. * }
    8. */
    9. /**
    10. * @param {TreeNode} root
    11. * @return {TreeNode[]}
    12. */
    13. var findDuplicateSubtrees = function (root) {
    14. // 记录所有子树以及出现的次数
    15. const memo = new Map();
    16. const res = [];
    17. const traverse = (node) => {
    18. // 对于空节点,可以用一个特殊字符表示
    19. if (!node) {
    20. return "#";
    21. }
    22. // 将左右子树序列化成字符串,左右子树加上自己,就是以自己为根的二叉树序列化结果
    23. const key = node.val + "," + traverse(node.left) + traverse(node.right);
    24. let value = memo.get(key) || 0;
    25. // 多次重复也只会被加入结果集一次
    26. if (value === 1) {
    27. // 有人和我重复,把自己加入结果列表
    28. res.unshift(node);
    29. }
    30. // 给子树对应的出现次数加一
    31. memo.set(key, value + 1);
    32. return key;
    33. };
    34. traverse(root);
    35. return res
    36. };

    image.png