0
点赞
收藏
分享

微信扫一扫

后序遍历-leetcode-652

给你一棵二叉树的根节点 root ,返回所有 重复的子树 

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

如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是 重复 的。

示例 1:

后序遍历-leetcode-652_结点

输入:root = [1,2,3,4,null,2,4,null,null,4]
输出:[[2,4],[4]]

示例 2:

后序遍历-leetcode-652_子树_02

输入:root = [2,1,1]
输出:[[1]]

示例 3:

后序遍历-leetcode-652_子树_03

输入: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)

举报

相关推荐

0 条评论