算法挑战26: 寻找重复的子树

4 阅读1分钟

题目:

给你一棵二叉树的根节点 root ,返回所有 重复的子树

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

如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是 重复 的。

思路:

需要把二叉树序列化

把每个根节点的左子节点,右子节点,根节点的值组成一个字符串,每后序遍历到一个根节点时,就能有一个这样的字符串

把字符串存入map的键中,初始值为0

如果遇到一样的字符串,就给值+1

如果遇到count = 1了,就说明这个重复了

就把当前根节点push到res结果数组中就好了

子节点是空节点的话,统一用#来表示

代码:

var findDuplicateSubtrees = function (root) {
    let map = new Map();
    let res = [];

    function traverse(node) {
        if (!node) return '#';

        let leftStr = traverse(node.left);
        let rightStr = traverse(node.right);
        //后续遍历,拼接字符串
        const nodeStr = `${leftStr},${rightStr},${node.val}`;
        const count = map.get(nodeStr) || 0;
        //判断
        if (count === 1) {
            res.push(nodeStr)
        }
        
        map.set(nodeStr, count + 1);

        return nodeStr;
    }
    traverse(root);
    return res;
};