寻找重复的子树
- leetcode652. 寻找重复的子树
- 题目描述
- 解题思路
- 代码演示
- 二叉搜索树专题
leetcode652. 寻找重复的子树
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-duplicate-subtrees
题目描述
给你一棵二叉树的根节点 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, 5000] 范围内。
-200 <= Node.val <= 200
解题思路
使用序列化对每一颗子树都进行序列化成字符串。
要保证:
相同的子树序列化后结果相同
不同的子树序列化后结果不同
然后我们用hash 表保存每个子树出现的次数,从1开始,出现过一次就记录下来。
就是答案了。
注意:序列化可以用前序和后序,不能使用中序,因为中序出来的结果不是唯一的。
下面我们代码演示下后序遍历来解答:
代码演示
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
Map<String, Integer> map = new HashMap();
List<TreeNode> result = new ArrayList();
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
if(root == null ){
return null;
}
process(root);
return result;
}
/**
* 后序遍历进行序列化
*/
public String process(TreeNode root){
if(root == null){
return "";
}
String left = process(root.left);
String right = process(root.right);
StringBuilder sb = new StringBuilder();
//分隔符可以用逗号也可以用别的,都可以的。
sb.append(root.val).append(",").append(left).append(",").append(right);
String str = sb.toString();
//出现过一次时,就加进去
if(map.getOrDefault(str,0) == 1){
result.add(root);
}
//第一次出现就是1 后序加1
map.put(str,map.getOrDefault(str,0) +1);
return str;
}
}
二叉搜索树专题
leetcode700. 二叉搜索树中的搜索
leetcode98. 验证二叉搜索树
leetcode701. 二叉搜索树中的插入操作
leetcode450. 删除二叉搜索树中的节点