题目:
给你一棵二叉树的根节点 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;
};