给你一棵二叉树的根节点 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
Related Topics
👍 662, 👎 0bug 反馈 | 使用指南 | 更多配套插件
思路:利用后续遍历,记录每次遍历的叶子节点,判断其出现次数
//leetcode submit region begin(Prohibit modification and deletion)
/**
* 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<String,Integer>();
List<TreeNode> result = new ArrayList<TreeNode>();
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
traverse(root);
return result;
}
String traverse(TreeNode root) {
if(root==null){
return "#";
}
//后序 左右根
String left = traverse(root.left);
String right = traverse(root.right);
String subTree = root.val + ","+left+","+right;
int count = map.getOrDefault(subTree, 0);
if (count == 1) {
result.add(root);
}
map.put(subTree, count + 1);
return subTree;
}
}
//leetcode submit region end(Prohibit modification and deletion)