Leetcode 1379.找出克隆二叉树中的相同节点

news2024/11/23 11:46:37

给你两棵二叉树,原始树 original 和克隆树 cloned,以及一个位于原始树 original 中的目标节点 target

其中,克隆树 cloned 是原始树 original 的一个 副本 

请找出在树 cloned 中,与 target 相同 的节点,并返回对该节点的引用(在 C/C++ 等有指针的语言中返回 节点指针,其他语言返回节点本身)。

注意:你 不能 对两棵二叉树,以及 target 节点进行更改。只能 返回对克隆树 cloned 中已有的节点的引用。

示例 1:

输入: tree = [7,4,3,null,null,6,19], target = 3
输出: 3
解释: 上图画出了树 original 和 cloned。target 节点在树 original 中,用绿色标记。答案是树 cloned 中的黄颜色的节点(其他示例类似)。

示例 2:

输入: tree = [7], target =  7
输出: 7

示例 3:

输入: tree = [8,null,6,null,5,null,4,null,3,null,2,null,1], target = 4
输出: 4

提示:

  • 树中节点的数量范围为 [1, 104] 。
  • 同一棵树中,没有值相同的节点。
  • target 节点是树 original 中的一个节点,并且不会是 null 。

一、信息

1.给我两个二叉树,一个是原始树,一个是克隆树,以及目标节点target。

2.克隆树是原始树的一个副本(这句话什么意思?)

3.克隆树是原始树的一个副本。

4.请找出树中target相同的节点,并返回对该节点的引用。

七、我的答案:

为了解决这个问题,我们需要采用DFS(深度优先搜索)或BFS(广度优先搜索)在克隆树`cloned`中查找与`original`中的`target`节点值相同的节点。因为题目说明树中没有值相同的节点,我们可以通过比较节点的值来找到目标节点。我们不会更改任何树的结构,只会返回目标节点的引用。

以下是C语言、C++和Java中实现的代码:

### C语言

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};

struct TreeNode* getTargetCopy(struct TreeNode* original, struct TreeNode* cloned, struct TreeNode* target) {
    if (!cloned) return NULL;
    if (cloned->val == target->val) return cloned;
    struct TreeNode* left = getTargetCopy(original, cloned->left, target);
    if (left) return left;
    return getTargetCopy(original, cloned->right, target);
}

### C++

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
    TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {
        if (!cloned) return nullptr;
        if (cloned->val == target->val) return cloned;
        TreeNode* left = getTargetCopy(original, cloned->left, target);
        if (left) return left;
        return getTargetCopy(original, cloned->right, target);
    }
};

### Java

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

class Solution {
    public final TreeNode getTargetCopy(final TreeNode original, final TreeNode cloned, final TreeNode target) {
        if (cloned == null) return null;
        if (cloned.val == target.val) return cloned;
        TreeNode left = getTargetCopy(original, cloned.left, target);
        if (left != null) return left;
        return getTargetCopy(original, cloned.right, target);
    }
}

思考过程和分析过程
我们使用递归DFS来遍历二叉树的每一个节点。对于当前的节点,我们首先检查它是否是我们正在寻找的`target`,如果是,则返回当前的`cloned`节点。如果不是,我们会递归地在左子树和右子树中查找。如果在左子树中找到了目标节点,我们会立即返回,不再在右子树中查找。

此算法的时间复杂度是O(n),其中n是二叉树中节点的数量,因为在最坏的情况下我们可能需要遍历所有节点。空间复杂度是O(h),其中h是树的高度,即递归栈的最大深度。

进阶:如果树中允许出现值相同的节点,将如何解答?

如果树中允许出现值相同的节点,我们无法仅通过节点的值来找到目标节点。这种情况下,我们需要同时遍历原始树`original`和克隆树`cloned`,并比较`original`中的节点是否与`target`相同,如果相同,则返回`cloned`树中对应的节点。

### C语言

struct TreeNode* getTargetCopy(struct TreeNode* original, struct TreeNode* cloned, struct TreeNode* target) {
    if (!original) return NULL;
    if (original == target) return cloned;
    struct TreeNode* left = getTargetCopy(original->left, cloned->left, target);
    if (left) return left;
    return getTargetCopy(original->right, cloned->right, target);
}

### C++

class Solution {
public:
    TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {
        if (!original) return nullptr;
        if (original == target) return cloned;
        TreeNode* left = getTargetCopy(original->left, cloned->left, target);
        if (left) return left;
        return getTargetCopy(original->right, cloned->right, target);
    }
};

### Java

class Solution {
    public final TreeNode getTargetCopy(final TreeNode original, final TreeNode cloned, final TreeNode target) {
        if (original == null) return null;
        if (original == target) return cloned;
        TreeNode left = getTargetCopy(original.left, cloned.left, target);
        if (left != null) return left;
        return getTargetCopy(original.right, cloned.right, target);
    }
}

### 分析过程
1. **比较原始节点与目标节点**:
   在遍历时,我们比较原始树`original`的当前节点是否与`target`相同。如果相同,我们返回克隆树`cloned`中相对应的节点。

2. **递归遍历**:
   如果原始树的当前节点不是目标节点,我们递归地在左子树和右子树中查找。我们同步遍历原始树`original`和克隆树`cloned`。

3. **返回结果**:
   如果在左子树中找到了目标节点,我们会立即返回,不再在右子树中查找。如果左子树中没有找到,我们会继续在右子树中查找。

这个解决方案的时间复杂度和空间复杂度与前一个相同,即O(n)的时间复杂度和O(h)的空间复杂度,其中n是树中的节点数量,h是树的高度。

总结:

通过这道题目,我们可以学到几个重要的知识点和技能:

### 1. **二叉树的遍历**
这道题目展示了如何使用深度优先搜索(DFS)来遍历二叉树的每一个节点。通过递归地遍历左子树和右子树,我们可以访问二叉树中的每一个节点。这是解决许多二叉树问题的基础技能。

### 2. **递归**
这个问题展示了递归是如何应用于二叉树的遍历中的。通过递归的左、右子树调用,我们可以简洁、清晰地编写代码来遍历整棵树。

### 3. **指针和引用**
在C和C++实现中,我们使用指针来访问和返回树的节点。在Java中,我们通过引用来实现。理解如何在不同的编程语言中使用指针和引用是理解这道题目的关键。

### 4. **同步遍历**
在进阶部分,我们学习了如何同步遍历两棵二叉树。这是一种重要的技巧,尤其是当你需要比较两棵树的结构或值时。

### 5. **理解问题约束**
开始时,题目中提到树中没有值相同的节点,所以我们可以简单地通过比较节点的值来找到目标节点。但在进阶问题中,我们需要更仔细地思考如何在允许值相同的情况下找到正确的节点。我们学会了如何根据问题的不同约束来调整我们的解决方案。

### 6. **代码的适应性和可扩展性**
这道题展示了如何编写可以应对不同需求变化的代码。当问题约束发生变化时(例如,当树中允许有相同值的节点时),我们应该能够灵活地调整我们的代码以适应新的需求。

### 7. **问题分析**
最后,这个问题也教会了我们如何分析问题,理解问题的需求和约束,并根据这些需求和约束来制定解决方案。这包括理解时间复杂度和空间复杂度,以及如何优化它们来满足可能的性能要求。

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

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

相关文章

JDK 21 — JDK 21发布及多项新特性!

一、JDK 21 新特性说明 JDK 21 已经于 2023 年 9 月 19 日正式发布,Java 21 / JDK 21 已正式 GA,此版本是继 JDK 17 后的长期支持版本 (LTS),Oracle 将为其提供至少八年的技术支持和更新。本文总结了 JDK 21 发布的新特性。 二、JDK 21 正式…

基于PyTorch3D的GeoAI实现【ESRI】

Esri 的 AI 原型团队正在以 PyTorch3D API 的一系列 PR 的形式分享一些功能增强功能。 这些功能支持 obj 格式的网格的输入/输出 (I/O),该网格具有多个纹理和代表真实世界几何形状的顶点坐标。 对于 GeoAI 任务,这些功能支持跨网格分割管道的任务&#x…

第36节——useDebugValue+React Developer Tools——了解

一、概念 勾住”React开发调试工具中的自定义hook标签,让useDebugValue勾住的自定义hook可以显示额外的信息。useDebugValue的目的是“在react开发者工具自定义hook标签中显示额外信息”,方便我们“一眼就能找到”对应的自定义hook。useDebugValue(valu…

信息安全:网络物理隔离技术原理与应用.

信息安全:网络物理隔离技术原理与应用. 随着网络攻击技术不断增强,恶意入侵内部网络的风险性也相应急剧提高。满足内外网信息及数据交换需求,又能防止网络安全事件出现的安全技术就应运而生了,这种技术称为“物理隔离技术” 基本原…

如何用Postman做接口自动化测试

前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试,模拟人去操作软件界面,把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码,属于一种软件开发工作,已经开发完…

应用开发平台集成工作流系列之12——流程导航功能设计与实现

背景 流程模板主要是用于流程建模的,对于业务用户而言,需要一个业务流程的导航页,分门别类展示业务流程清单,用于发起新的流程。 并且需要根据当前用户过滤,只显示有权限发起的流程。 业务流程类别的处理 一个企业的…

OCR -- 文本检测

目标检测: 不仅要解决定位问题,还要解决目标分类问题,给定图像或者视频,找出目标的位置(box),并给出目标的类别; 文本检测: 给定输入图像或者视频,找出文本的…

基于 SpringBoot+Vue 的口腔管理平台,附源码,数据库

第一章 简介 本项目,是基于 Java SpringBoot 开发的,主要功能包括首页、个人中心、病例就诊信息管理、复查提醒管理、预约挂号管理、我的收藏管理、订单管理,前台首页;首页、牙齿保健产品、牙齿保护小知识、留言反馈、个人中心、…

React(react18)中组件通信05——redux ➕ react-redux(含数据共享)

React(react18)中组件通信05——redux ➕ react-redux(含数据共享) 1. 前言1.1 React中组件通信的其他方式1.2 介绍React-Redux1.2.1 简单介绍React-Redux1.2.2 官网 1.3 安装react-redux 2. 简单改写redux的例子2.1 提供store2.2…

【从0学习Solidity】37. 数字签名 Signature

【从0学习Solidity】37. 数字签名 Signature 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0…

提示计算机丢失msvcp140.dll怎么办,缺少msvcp140.dll一键修复

在计算机使用过程中,我们可能会遇到各种稀奇古怪的问题。其中,msvcp140.dll 文件丢失算是比较常见的一种。那么,究竟什么是 msvcp140.dll 文件?它为什么会丢失?我们又该如何解决这个问题呢?本文将围绕这些问…

向量数据库库Milvus Cloud2.3 技术选型中性能、成本、扩展性是重点

技术选型中性能、成本、扩展性是重点 对于向量数据库来说,用户最关心的莫过于性能、成本和扩展性。 Milvus 2.x 从 Day 1 开始就将扩展性作为设计的第一优先级,在众多用户环境中落地了十亿至百亿级别场景。不止如此,对于 Milvus 来说,扩展性不仅仅意味着支持百亿级别向量,…

vue指令(代码部分)

注&#xff1a;此部分为学习uni-app时接触到的vue <template><view><view>当前标题&#xff1a;{{title}}</view><view> {{num}}</view><view>{{arr[2]}}</view><view>{{obj}}</view><view>{{obj.name}}&l…

导览软件定制开发方案

随着智能手机的普及和人们对文化、旅游等方面的需求不断增加&#xff0c;导览软件市场前景广阔。本文将围绕导览软件定制开发方案展开&#xff0c;包括以下部分&#xff1a; 一、行业现状及市场需求 导览软件市场发展迅速&#xff0c;各类导览软件层出不穷。通过对市场…

价值1000的情感爆文写作prompt,助你写出10万+阅读微信爆文

原文&#xff1a;价值1000的情感爆文写作prompt&#xff0c;助你写出10万阅读微信爆文 - 知乎 是否经常看到一些自媒体晒出这样的图片&#xff1f; 或者是这样的10w的阅读文章 那么这是真实能赚钱的吗&#xff1f;还是自媒体夸大其说&#xff0c;吸引流量。 我们先简单了解什…

ElementUI之登陆+注册->饿了吗完成用户登录界面搭建,axios之get请求,axios之post请求,跨域,注册界面

饿了吗完成用户注册登录界面搭建axios之get请求axios之post请求跨域 1.饿了吗完成用户注册登录界面搭建 将端口号8080改为8081 导入依赖&#xff0c;在项目根目录使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 -g&#xff1a;将依赖下载node_glodal全局依…

网络上怎么赚点零花钱

现代物质社会中&#xff0c;我们常常会被琐碎的开销困扰。无论是衣食住行还是休闲娱乐&#xff0c;总有一些额外的花费&#xff0c;使我们不得不时常思索如何赚点零花钱。而现如今&#xff0c;随着互联网的飞速发展&#xff0c;我们有了更多的机会通过网络来实现这个目标。现在…

Centos7做回收站功能-防止误删除

Centos7做回收站功能&#xff0c;就算误删了文件&#xff0c;也可以还原回来 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.先创建一个回收站的目录&#xff08;我在/data下&#xff09; 在大磁盘的目录下创建.trash文件夹 mkdir -p /data/.trash 2.在/root/.bas…

Vue之ElementUI实现登陆及注册

目录 ​编辑 前言 一、ElementUI简介 1. 什么是ElementUI 2. 使用ElementUI的优势 3. ElementUI的应用场景 二、登陆注册前端界面开发 1. 修改端口号 2. 下载ElementUI所需的js依赖 2.1 添加Element-UI模块 2.2 导入Element-UI模块 2.3 测试Element-UI是否能用 3.编…

Nodejs基于Vue.js编程语言在线学习平台的设计与实现5y4p2

本编程语言在线学习平台是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了用户和管理员这二者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;尽可能优…