给定一棵二叉树 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,104]范围内。
-200 <= Node.val <= 200
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-duplicate-subtrees
(1)递归
//思路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记录所有子树出现的次数
键:子树按照后序遍历组成的节点值序列,中间用","隔开,最终形成一个字符串
值:该字符串在map中出现的次数
*/
HashMap<String, Integer> map = new HashMap<>();
//res用于保存最终结果
ArrayList<TreeNode> res = new ArrayList<>();
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
traverse(root);
return res;
}
public String traverse(TreeNode root) {
if (root == null) {
return "";
}
String left = traverse(root.left);
String right = traverse(root.right);
//按照后序遍历组成的节点值序列,中间用","隔开
String subTree = left + "," + right + "," + root.val;
//从map中查询当前子树subTree出现的次数,如果map中没有,则返回0
int cnt = map.getOrDefault(subTree, 0);
//cnt == 1 说明map中已经存在当前子树,故将其加入到res中
if (cnt == 1) {
res.add(root);
}
//map中对应子树出现的次数+1
map.put(subTree, cnt + 1);
return subTree;
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_43004044/article/details/123952031
内容来源于网络,如有侵权,请联系作者删除!