尋找重複的子樹
阿新 • • 發佈:2020-11-03
尋找重複的子樹
題目:
給定一棵二叉樹,返回所有重複的子樹。對於同一類的重複子樹,你只需要返回其中任意一棵的根結點即可。
兩棵樹重複是指它們具有相同的結構以及相同的結點值。
示例 1:
下面是兩個重複的子樹:
和
解題思路:需要比較子樹結構,那麼就要想一個辦法讓子樹結構具象化,所以想到了序列化二叉樹,將樹的結構變成了字串,再用HashMap儲存字串出現的次數即子樹結構出現的次數
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { //記錄子樹出現次數 Map<String, Integer> map = new HashMap<>(); List<TreeNode> res = new ArrayList<>(); public List<TreeNode> findDuplicateSubtrees(TreeNode root) { serial(root); return res; } //序列化子樹 public String serial(TreeNode root) { if(root == null) return "#"; String left = serial(root.left); String right = serial(root.right); String str = root.val + "," + left + "," + right; int count = map.getOrDefault(str, 0); //每個子樹只加入一次 if(count == 1) res.add(root); map.put(str, count + 1); return str; } }