持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
题目详情
LeetCode题库序号 652. 寻找重复的子树 ,难度为 中等。
Tag : 「深度优先搜索」 给定一棵二叉树 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]]
提示:
- 树中的结点数在
[1,10^4]范围内。 -200 <= Node.val <= 200
深度优先搜索
题解思路: 寻找重复子树,对于树的搜索的话,可以使用深度深度优先搜索,这种方式可以让我们搜索完整颗树,但是对于重复的子树,我们要如何判断他们是重复的,想到的方式肯定是将树进行序列化成字符串,然后根据序列化的值去比较。使用一个Map来存储序列化的字符串与其对应的真正的树的根节点。题目解法详情见以下代码:
题解代码
class Solution {
Map<String, TreeNode> map = new HashMap<>();
Set<TreeNode> nodeSet = new HashSet<>();
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
dfs(root);
return new ArrayList<>(nodeSet);
}
public String dfs(TreeNode node) {
if (node == null) {
return "";
}
StringBuilder sb = new StringBuilder();
sb.append(node.val);
sb.append("(");
sb.append(dfs(node.left));
sb.append(")(");
sb.append(dfs(node.right));
sb.append(")");
String serial = sb.toString();
if (map.containsKey(serial)) {
nodeSet.add(map.get(serial));
} else {
map.put(serial, node);
}
return serial;
}
}
结尾
我的"刷完LeetCode题库"系列文章的第 No.652 序号的题目,本次刷题之旅系列开始于 2022-06-12,因为LeetCode上部分是有锁题,我自己的目标是将先把所有不带锁的题目刷完。自己能够通过这次刷题之旅勉励自己,并且提升逻辑思维能力。这个系列的文章就是会见证我自己的一个成长过程!
思路虽然不是最优的,但是我会尽我所能!
为了让我自己的刷题之旅不中断,我特地建立了相关的仓库,来记录我自己的刷题之旅。 github.com/jackpan123/… 。