【递归】5.leetcode 872 叶子相似的树

news/2024/9/29 3:28:13/

1 题目描述

题目链接:叶子相似的树
在这里插入图片描述

2 解答思路

递归分为三步,接下来就按照这三步来思考问题

第一步:挖掘出相同的子问题  (关系到具体函数头的设计)
第二步:只关心具体子问题做了什么  (关系到具体函数体怎么写,是一个宏观的过程)
第三步:找到递归的出口,防止死递归  (关系到如何跳出递归)

2.1 相同的子问题(函数头设计)

从题目的描述中可以看到,最终的目的是找到二叉树的叶子节点。
在这里插入图片描述
这里相同的子问题就是:找A的叶子节点,就是找A的左子树的叶子节点和找A的右子树的叶子节点

下面是leetcode给的函数头:

    bool leafSimilar(TreeNode* root1, TreeNode* root2) {}

从上面可以看出,传入的是两个二叉树,最后返回true或者 false.

根据我们得到的相同的子问题,里面有两个关键点:
1.二叉树
2.叶子节点

因此,我们的函数头需要两个参数:一个是TreeNode*类型的(存储二叉树),一个是vector<int>类型的(存储叶子节点)。

基于此,我们自己设计一个函数头:

    void leaf(TreeNode* root, vector<int>& res){}

注意:因为我们最后是拿vector<int>里面存储的叶子节点来比较,所以函数没有返回值。

2.2 具体的子问题做了什么(函数体的实现)

传入的参数是一个TreeNode* root, 一个vector<int> res,具体的子问题:
判断该子树是不是叶子节点,是就加入到res中,不是就继续找它的左子树的叶子节点和找右子树的叶子节点

因此,下面就是函数体的实现:(顺便讲解了递归的出口)

    void leaf(TreeNode* root, vector<int>& res){//递归的出口if (root == nullptr)return;//如果是叶子节点就加入到res中if (root->left == nullptr && root->right == nullptr)res.push_back(root->val);//不是叶子节点就左子树和右子树中继续执行此操作leaf(root->left, res);leaf(root->right, res);}

3 总结

class Solution {
public:bool leafSimilar(TreeNode* root1, TreeNode* root2) {vector<int> res1, res2;leaf(root1, res1);leaf(root2, res2);if (res1.size() != res2.size())return false;for (int i = 0; i < res1.size(); ++ i){if (res1[i] != res2[i]) return false;}return true;}void leaf(TreeNode* root, vector<int>& res){//递归的出口if (root == nullptr)return;//如果是叶子节点就加入到res中if (root->left == nullptr && root->right == nullptr)res.push_back(root->val);//不是叶子节点就左子树和右子树中继续执行此操作leaf(root->left, res);leaf(root->right, res);}
};
相同的子问题: 找二叉树的叶子节点就是找二叉树的左子树的叶子节点和右子树的叶子节点只关心具体子问题做了什么:判断该节点是不是叶子节点,是就插入到vector中,不是就继续去左子树和右子树寻找叶子节点
递归的出口:节点为空

在这里插入图片描述


http://www.ppmy.cn/news/1530663.html

相关文章

工业交换机如何保证数据的访问安全

在现代工业自动化环境中&#xff0c;工业交换机作为关键的网络设备&#xff0c;扮演着数据传输和信息交互的重要角色。为了确保数据的访问安全&#xff0c;工业交换机不仅具备高效的转发性能&#xff0c;还集成了多层次的安全防护机制&#xff0c;以抵御各种潜在的网络威胁。 首…

alpine安装docker踩坑记

文章目录 前言错误场景正确操作最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;最近使用alpine操作系统上docker遇到了一些错误&#xff0c;尝试解决之后就准备输出一篇博客&#xff0c;帮助有需要的后人能够少踩坑&#xff0c;因为淋过雨所以想给别人撑伞 错误场景 我…

新产品,推出 MLX90372GVS 第三代 Triaxis® 位置传感器 IC,适用于汽车和工业系统(MLX90372GVS-ACE-308)

Triaxis 旋转和线性位置传感器IC&#xff1a; MLX90372GVS-ACE-103 MLX90372GVS-ACE-108 MLX90372GVS-ACE-301 MLX90372GVS-ACE-200 MLX90372GVS-ACE-208 MLX90372GVS-ACE-303 MLX90372GVS-ACE-300 MLX90372GVS-ACE-350 MLX90372GVS-ACE-100 MLX90372GVS-ACE-101 MLX90372GVS-…

OpenHarmony(鸿蒙南向)——平台驱动开发【SDIO】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 SDIO&#xff08;Secure Digital Input and Outpu…

流 Stream

流 Stream 基础概念 流 流处理是对运动中的数据的处理&#xff0c;在生成或接收数据时直接计算数据。应用程序中分析和查询不断存在&#xff0c;数据不断地流经它们。在从流中接收到事件时&#xff0c;流处理应用程序对该事件作出反应。 如果我们使用传统的循环迭代方式对数…

1.随机事件与概率

第一章 随机时间与概率 1. 随机事件及其运算 1.1 随机现象 ​ 确定性现象&#xff1a;只有一个结果的现象 ​ 确定性现象&#xff1a;结果不止一个&#xff0c;且哪一个结果出现&#xff0c;人们事先并不知道 1.2 样本空间 ​ 样本空间&#xff1a;随机现象的一切可能基本…

WPF 自定义路由事件

WPF 自定义路由事件 一、自定义路由事件步骤 ① 注册路由事件    ② 为路由事件添加 CLR 事件包装器    ③ 创建可激发路由事件的方法 二、注册路由事件 EventManager.RegisterRoutedEvent(String, RoutingStrategy, Type, Type)     作用&#xff1a;将新的路由事件…

zabbix基本概念与组件

文章目录 一、zabbix简介二、​​​​​​​zabbix构成三、​​​​​​​zabbix监控对象四、​​​​​​​zabbix常用术语五、 Zabbix 6.0 新特性1.Zabbix server高可用防止硬件故障或计划维护期的停机2.Kubernetes系统从多个维度采集指标 六、zabbix 工作原理1、主动模式2、…