From a2e1eed8473487d767c9f0ce3de8f017b5f10dd5 Mon Sep 17 00:00:00 2001 From: huangge1199 Date: Fri, 3 Sep 2021 10:54:17 +0800 Subject: [PATCH] =?UTF-8?q?652:=E5=AF=BB=E6=89=BE=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../editor/cn/FindDuplicateSubtrees.java | 90 +++++++++++++++++++ .../cn/doc/content/FindDuplicateSubtrees.md | 29 ++++++ 2 files changed, 119 insertions(+) create mode 100644 src/main/java/leetcode/editor/cn/FindDuplicateSubtrees.java create mode 100644 src/main/java/leetcode/editor/cn/doc/content/FindDuplicateSubtrees.md diff --git a/src/main/java/leetcode/editor/cn/FindDuplicateSubtrees.java b/src/main/java/leetcode/editor/cn/FindDuplicateSubtrees.java new file mode 100644 index 0000000..87b1b5d --- /dev/null +++ b/src/main/java/leetcode/editor/cn/FindDuplicateSubtrees.java @@ -0,0 +1,90 @@ +//给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。 +// +// 两棵树重复是指它们具有相同的结构以及相同的结点值。 +// +// 示例 1: +// +// 1 +// / \ +// 2 3 +// / / \ +// 4 2 4 +// / +// 4 +// +// +// 下面是两个重复的子树: +// +// 2 +// / +// 4 +// +// +// 和 +// +// 4 +// +// +// 因此,你需要以列表的形式返回上述重复子树的根结点。 +// Related Topics 树 深度优先搜索 广度优先搜索 二叉树 👍 303 👎 0 + +package leetcode.editor.cn; + +import com.code.leet.entiy.TreeNode; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +//652:寻找重复的子树 +class FindDuplicateSubtrees { + public static void main(String[] args) { + //测试代码 + Solution solution = new FindDuplicateSubtrees().new Solution(); + } + + //力扣代码 + //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 count; + List ans; + + public List findDuplicateSubtrees(TreeNode root) { + count = new HashMap(); + ans = new ArrayList(); + collect(root); + return ans; + } + + public String collect(TreeNode node) { + if (node == null) { + return "#"; + } + String serial = node.val + "," + collect(node.left) + "," + collect(node.right); + count.put(serial, count.getOrDefault(serial, 0) + 1); + if (count.get(serial) == 2) { + ans.add(node); + } + return serial; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/doc/content/FindDuplicateSubtrees.md b/src/main/java/leetcode/editor/cn/doc/content/FindDuplicateSubtrees.md new file mode 100644 index 0000000..ffd6d51 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/doc/content/FindDuplicateSubtrees.md @@ -0,0 +1,29 @@ +

给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。

+ +

两棵树重复是指它们具有相同的结构以及相同的结点值。

+ +

示例 1:

+ +
        1
+       / \
+      2   3
+     /   / \
+    4   2   4
+       /
+      4
+
+ +

下面是两个重复的子树:

+ +
      2
+     /
+    4
+
+ +

+ +
    4
+
+ +

因此,你需要以列表的形式返回上述重复子树的根结点。

+
Related Topics
  • 深度优先搜索
  • 广度优先搜索
  • 二叉树

  • 👍 303
  • 👎 0
  • \ No newline at end of file