LeetCode(652):寻找重复的子树 Find Duplicate Subtrees(Java)

234 篇文章 1 订阅
177 篇文章 0 订阅

2019.11.12 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)

github:https://github.com/ChopinXBP/LeetCode-Babel

这题需要借助哈希表对已遍历的子树进行存储,为了避免重复计算,哈希表选取的key值可以选取序列化后的二叉树,通过后序遍历递归进行。


传送门:寻找重复的子树

Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only need to return the root node of any one of them.

Two trees are duplicate if they have the same structure with same node values.

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

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

示例 1:
        1
       / \
      2   3
     /   / \
    4   2   4
       /
      4
下面是两个重复的子树:

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


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 *
 * Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only need to return the root node of any one of them.
 * Two trees are duplicate if they have the same structure with same node values.
 * 给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
 * 两棵树重复是指它们具有相同的结构以及相同的结点值。
 *
 */

public class FindDuplicateSubtrees {
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) {
            val = x;
        }
    }

    //二叉树序列化+哈希表
    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        ArrayList<TreeNode> result = new ArrayList<>();
        Solution(root, new HashMap<>(), result);
        return result;
    }

    private String Solution(TreeNode root, HashMap<String, Integer> map, ArrayList<TreeNode> result){
        if(root == null){
            return "#";
        }
        //后序遍历序列化的二叉树
        String serial = root.val + "," + Solution(root.left, map, result) + "," + Solution(root.right, map, result);
        //只在第一次重复时加入
        if(map.getOrDefault(serial, 0) == 1){
            result.add(root);
        }
        map.put(serial, map.getOrDefault(serial, 0) + 1);
        return serial;
    }
}




#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值