数据结构】二叉树篇|超清晰图解和详解:后序篇

news2024/9/22 2:30:03

在这里插入图片描述

  • 博主简介:努力学习的22级计算机科学与技术本科生一枚🌸
  • 博主主页: @是瑶瑶子啦
  • 每日一言🌼: 你不能要求一片海洋,没有风暴,那不是海洋,是泥塘——毕淑敏

目录

  • 一、核心
  • 二、题目

一、核心

我们清楚,在二叉树的遍历中,通常有三个位置:

  • 前序位置
  • 中序位置
  • 后序位置

今天我们来具体总结一下其中的两个位置:

  • 🍊 前序:它能获得的信息:当前节点,但是不难获得左右节点(或者可以叫做子树的信息),一般大多数情况。
  • 🍊后序:当前节点信息+左右子树信息。所以当一个二叉树的题目,在遍历的过程中不仅需要看遍历到的当前节点的信息时,还要看其子树的信息,那么通常要在后序位置上做文章,利用好递归函数的返回值——获取子树信息。—— 本质还是第二种二叉树问题:分解成子问题,利用好返回值

下面详细讲一个题目,来体会一下

二、题目

🔗652. 寻找重复的子树
在这里插入图片描述

  • 👧🏻思路:

    • 首先,明确的是,这题的本质还是:遍历。因为每个节点为根就是一个子树,找重复子树,那么每个节点都要遍历到这是毋庸置疑的。⭐
    • 遍历到了这个节点,我如何知道以这个节点为根的子树是什么样子的呢?——根节点+左右子树。这个时候只知道此时的根节点什么样子没什么用,关键是也要知道以它为根的左右子树什么样子。那么这个时候要在后序位置上做文章了。因为后序位置处于一个:既遍历到了根节点也遍历到了子树节点的一个位置,即:既有根节点信息,又有以此根节点为根的子树信息。⭐
    • 其次,可以利用前面所讲的二叉树的序列化,以字符串的形式来把该二叉树存起来,再用字符串的哈希表来判断是否重复。
  • 🙇🏻‍♀️代码:

/**
 * 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<>(); //存储二叉树的序列化字符串,判断是否重复
    List<TreeNode> ans = new ArrayList<>(); //存储答案,即:有重复子树的根节点
    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        dfs(root);  //遍历二叉树
        return ans;
    }
    //这个遍历函数的作用:序列化一颗二叉树,返回序列化字符串(利用好返回值)
    String dfs(TreeNode root){
        if(root == null) return"#";
        StringBuilder sb = new StringBuilder();

        //前序位置
        sb.append(root.val).append(",");
        //中序
        sb.append(dfs(root.left)).append(dfs(root.right));//获取左右子树信息
        //后序位置
        String key = sb.toString();//存储整个二叉树信息
        map.put(key, map.getOrDefault(key, 0) + 1);

        if(map.get(key) == 2) ans.add(root);    //一旦超过2个。就add

        return key;
    }
}

💐若有疑问的地方,欢迎随时在评论区or私信找瑶瑶子交流讨论🌺

在这里插入图片描述

  • Java岛冒险记【从小白到大佬之路】

  • LeetCode每日一题–进击大厂

  • Go语言核心编程

  • 算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/936384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UML四大关系

文章目录 引言UML的定义和作用UML四大关系的重要性和应用场景关联关系继承关系聚合关系组合关系 UML四大关系的进一步讨论UML四大关系的实际应用软件开发中的应用其他领域的应用 总结 引言 在软件开发中&#xff0c;统一建模语言&#xff08;Unified Modeling Language&#x…

飞桨中的李宏毅课程中的第一个项目——PM2.5的预测

所谓的激活函数&#xff0c;就是李宏毅老师讲到的sigmoid函数 和 hard sigmoid函数 &#xff0c;ReLU函数那些 现在一点点慢慢探索&#xff0c;会成为日后想都做不到的经历&#xff0c;当你啥也不会的时候&#xff0c;才是慢慢享受探索的过程。 有一说一&#xff0c;用chatGP…

观察级水下机器人使用系列之六超短基线(下)

本文主要讲述超短基线的安装校准和应用。 1、安装校准概述 水下声学导航系统标定算法的准确性很大程度上取决于所采集的数据质量、超短基线基阵的几何结构、高效的数值计算算法等方面。Mc Ewen 等在 2005 年发现了对于分立式的超短基线系统&#xff0c;水声传感器与姿态传感器…

数据结构--树4.2(二叉树)

目录 一、二叉树的定义和特点 1、定义 2、特点 二、二叉树的基本形态 1、空二叉树 2、只有一个根结点 3、根结点只有左子树 4、根结点只有右子树 5、根结点既有左子树又有右子树 6、斜树 7、满二叉树 8、满二叉树和完全二叉树 三、二叉树的性质 一、二叉树的定义和…

2. 使用IDEA创建Spring Boot Hello项目并管理依赖——Maven入门指南

前言&#xff1a;本文将介绍如何使用IDEA创建一个Spring Boot Hello项目&#xff0c;并通过Maven来管理项目的依赖。我们从项目的创建到代码的编写&#xff0c;再到项目的构建和运行&#xff0c;一步步演示了整个过程。 &#x1f680; 作者简介&#xff1a;作为某云服务提供商的…

LeetCode-738-单调递增的数字

题目描述&#xff1a; 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 解题思路&#xff1a; 先将int变成char[]&#xff0c;获取…

86. 分隔链表(中等系列)

给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3 输出&…

webassembly004 ggml wasm_eval 与js代码交互 调试

试用 $:~/ggml/ggml$cd examples/mnist $:~/ggml/ggml/examples/mnist$ emcc -I../../include -I../../include/ggml -I../../examples ../../src/ggml.c main.cpp -o web/mnist.js -s EXPORTED_FUNCTIONS["_wasm_eval","_wasm_random_digit","_mall…

Linux设备驱动之多个同类设备共用一套驱动

1. 应用场景 比如我们的设备上有很多一样的usb接口&#xff0c;这些usb接口都需要有驱动才能工作&#xff0c;那么是每个usb都一套单独的驱动程序么&#xff1f;显然不是的&#xff0c;这些usb接口属于同一类设备&#xff0c;用户对他们的操作方法完全一致&#xff0c;只不过不…

连接器信号完整性仿真教程 七

本将介绍微带线及差分微带线仿真。做连接器信号完整性仿真时&#xff0c;有时后没法将激励端口直接设置到连接器端子上&#xff0c;这就需画出连接器PCB PAD&#xff0c;将激励端口设置在PAD的端面上&#xff0c;或者用引线连接PAD&#xff0c;将引线引出到适当的位置&#xff…

Window基础命令

文章目录 查看哪些端口被禁用TCP协议删除开机启动项方案1方案2 查看哪些端口被禁用TCP协议 netsh interface ipv4 show excludedportrange protocoltcp删除开机启动项 方案1 列出所有启动项 bcdedit /enum仔细看你要删除的是哪一项&#xff08;看description&#xff09;&a…

2. 两数相加(中等系列)

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

Django基础6——数据模型关系

文章目录 一、基本了解二、一对一关系三、一对多关系3.1 增删改查3.2 案例&#xff1a;应用详情页3.2 案例&#xff1a;新建应用页 四、多对多关系4.1 增删改查4.2 案例&#xff1a;应用详情页4.3 案例&#xff1a;部署应用页 一、基本了解 常见数据模型关系&#xff1a; 一对一…

RabbitMQ+springboot用延迟插件实现延迟消息的发送

延迟队列&#xff1a;其实就是死信队列中消息过期的特殊情况 延迟队列应用场景&#xff1a; 可以用死信队列来实现&#xff0c;不过死信队列要等上一个消息消费成功&#xff0c;才会进行下一个消息的消费&#xff0c;这时候就需要用到延迟插件了&#xff0c;不过要线在docker上…

HSP高度敏感的人应该了解的内容(附图书资源)

推荐图书:《高敏感是种天赋》 在爆炸的信息海中希望你慢慢看&#xff0c;细细品~ 什么是高敏感人群&#xff1f; &#xff08;Highly Sensitive Person&#xff0c;简称HSP&#xff09;是指那些对外界刺激和情绪变化非常敏感&#xff0c;容易受到情绪的影响&#xff0c;并且需…

在window上配置NASM

NASM是支持x86、x64架构CPU的汇编器(汇编软件)&#xff1b;NASM也支持大量的文件格式&#xff0c;包括Linux&#xff0c;*BSD&#xff0c;a.out&#xff0c;ELF&#xff0c;COFF&#xff0c;Mach−O&#xff0c;Microsoft 16−bit OBJ&#xff0c;Win32以及Win64&#xff0c;同…

今天去看看俺姐(老婆)新开的超市

首发博客地址 https://blog.zysicyj.top/ 1 昨晚写博客到12点多&#xff0c;今天困死了&#xff0c;比较意外的是&#xff0c;早上老爸没有叫我&#xff0c;今天早上是老爸和小舅送的葡萄。 所以呢&#xff0c;今早睡得很晚&#xff0c;然后6点多才醒&#xff0c;睡得真舒服&am…

通过参数化可变形曲线直接从 X 射线投影数据计算分割研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

机器学习——KNN算法

1、&#xff1a;前提知识 KNN算法是机器学习算法中用于分类或者回归的算法&#xff0c;KNN全称为K nearest neighbour&#xff08;又称为K-近邻算法&#xff09; 原理&#xff1a;K-近邻算法采用测量不同特征值之间的距离的方法进行分类。 优点&#xff1a;精度高 缺点&…

Facechain使用教程:3张照片就能生成个人写真,还完全免费

1.效果展示 下面4张图片&#xff0c;小伙伴们有没有看出来哪些是原图&#xff0c;哪些是AI生成的呢&#xff1f; 上面的图片第1张是原图&#xff0c;其他的都是AI生成的哦~ 今天来教大家怎么用facechain训练自己的人物写真模型&#xff0c;然后就可以尝试各种风格的照片了。 …