• 【二叉树】寻找重复的子树


    题目描述

    给定一棵二叉树 root,返回所有重复的子树。

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

    如果两棵树具有相同的结构和相同的结点值,则它们是重复的。

    示例1:

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

    解题思路 

    1. 这里使用HashMap来做去重处理;
    2. 使用递归来记录每个根节点的字符串;

    按照示例1,对每个节点做遍历后效果:

    • 1()()
    • 4(1()())()
    • 1()()
    • 4(1()())()
    • 1()()
    • 2(4(1()())())(1()())
    • 5(4(1()())())(2(4(1()())())(1()()))

    其中1()()出现了3次,4(1()())()出现了2次,其他的出现了1次,根据题目要求返回1()() 和 4(1()())()对应的节点。

    代码实现

    1. class Solution {
    2. Set res = new HashSet<>();
    3. Map map = new HashMap();
    4. public List findDuplicateSubtrees(TreeNode root) {
    5. dfs(root);
    6. return new ArrayList<>(res);
    7. }
    8. private String dfs(TreeNode root) {
    9. if (root == null) {
    10. return "";
    11. }
    12. StringBuilder sb = new StringBuilder();
    13. sb.append(root.val);
    14. sb.append("(");
    15. sb.append(dfs(root.left));
    16. sb.append(")(");
    17. sb.append(dfs(root.right));
    18. sb.append(")");
    19. String s = sb.toString();
    20. if (map.get(s) != null) {
    21. res.add(map.get(s));
    22. } else {
    23. map.put(s, root);
    24. }
    25. return s;
    26. }
    27. }

    总结

    这道题是二叉树遍历的变体,考察核心如何遍历每个节点,并且做去重操作;如果有更加简洁、高效的思路欢迎回复。

     

  • 相关阅读:
    如何构建 Protocol Buffers(protobuf)并解决常见问题
    数据仓库建模自动化
    SpringCloud 学习笔记(3 / 3)
    决策树算法的一点基础知识补充
    idea搭建SSM项目这一篇就够了
    IndexTree以及应用
    数据结构期末刷题
    C 基础语法2 —— 数组
    WPS文件转PDF文件怎么转?建议看看这些方法
    Ceph的认证授权
  • 原文地址:https://blog.csdn.net/weiliuhong1/article/details/126715411