C++算法练习-day40——617.合并二叉树

devtools/2024/11/15 14:53:43/

题目来源:. - 力扣(LeetCode)

题目思路分析

题目:给定两棵二叉树 root1 和 root2,请合并这两棵树,即将 root2 中的每个节点合并到 root1 中,合并的规则是如果两个节点在同一位置(即具有相同的深度),则将它们的值相加。如果某个节点在 root1 中不存在,而在 root2 中存在,则直接将这个节点添加到 root1 中。

思路

  1. 递归遍历:由于树的性质,我们可以使用递归的方法来遍历树的每个节点。
  2. 节点处理:对于每对对应节点(root1 和 root2 中的同一位置的节点):
    • 如果两个节点都存在,则创建一个新节点,其值为两个节点值的和。
    • 如果其中一个节点不存在,则直接返回另一个节点(即如果 root1 中没有节点而 root2 中有,则直接返回 root2 的节点,反之亦然)。
  3. 递归调用:对左右子树递归调用合并函数。

代码:

/**  * Definition for a binary tree node.  * struct TreeNode {  *     int val;  *     TreeNode *left;  *     TreeNode *right;  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}  * };  */  
class Solution {  
public:  TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {  // 如果 root1 为空,直接返回 root2,因为要将 root2 合并到 root1 中  if(!root1){  return root2;  }  // 如果 root2 为空,直接返回 root1,因为 root1 没有变化  if(!root2){  return root1;  }  // 创建一个新节点,其值为两个节点值的和  TreeNode* node=new TreeNode(root1->val+root2->val);  // 递归调用 mergeTrees 合并左子树  node->left=mergeTrees(root1->left,root2->left);  // 递归调用 mergeTrees 合并右子树  node->right=mergeTrees(root1->right,root2->right);  // 返回合并后的新树的根节点  return node;  }  
};

知识点摘要

  1. 二叉树遍历:二叉树的遍历方式有前序、中序和后序遍历,以及层次遍历。本题使用了递归的方式遍历二叉树。
  2. 递归思想:递归是一种在函数内调用自身的编程技巧,适用于解决可以分解为相似子问题的问题。
  3. 动态内存分配:使用 new 关键字在堆上动态分配内存,用于创建新的节点。

通过这道题目,我们学习了如何使用递归方法合并两棵二叉树。递归的核心在于将大问题分解为小问题,并解决小问题,然后将结果组合起来解决大问题。在本题中,我们通过递归遍历树的每个节点,并合并对应位置的节点值,最终得到了合并后的树。这种方法不仅直观易懂,而且能够高效地解决问题。在实际应用中,递归方法在处理树结构或图结构的问题时非常有用,值得我们深入学习和掌握。


http://www.ppmy.cn/devtools/134187.html

相关文章

Linux——GPIO输入输出裸机实验

学习了正点原子Linux环境下的GPIO的输入输出的裸机实验学习,现在进行一下小结: 启动文件start.S的编写 .global _start .global _bss_start _bss_start:.word __bss_start.global _bss_end _bss_end:.word __bss_end_start:/*设置处理器进入SVC模式*/m…

技术整合与生态构建:Lyft与Mobileye引领自动驾驶新纪元

在科技日新月异的今天,自动驾驶技术正逐渐从科幻电影走进现实生活,成为出行服务领域的一股不可忽视的力量。近日,北美网约车巨头Lyft与自动驾驶技术领先者Mobileye宣布联手合作,共同推动自动驾驶汽车出行服务的广泛商业化进程。此…

数组的定义及打印

引入 上次讲到字符和字符串,二者可以打印到控制台,但是这样就让打印的内容固定了,那尝试改变一下——第一:单个的字符可以通过像int 、float那样定义变量,通过改变变量来改变打印内容;第二多个字符的字符串…

面试:TCP、UDP如何解决丢包问题

文章目录 一、TCP丢包原因、解决办法1.1 TCP为什么会丢包1.2 TCP传输协议如何解决丢包问题1.3 其他丢包情况(拓展)1.4 补充1.4.1 TCP端口号1.4.2 多个TCP请求的逻辑1.4.3 处理大量TCP连接请求的方法1.4.4 总结 二、UDP丢包2.1 UDP协议2.1.1 UDP简介2.1.2…

爬虫新姿势——使用Chrome Devtools写一个小说爬虫

目前,绝大部分的爬虫教程都是基于Python和Node.js。其实,只要有Chrome浏览器,使用Chrome F12打开的的Devtools就能随时随地轻轻松松写一个爬虫,完全不用装其它语言环境。今天就介绍一下只使用Chrome Devtools来爬取网站www.biqudu.com/31_317…

Wordpress常用配置,包括看板娘跨域等

一个Wordpress的博客已经搭建完成了,那么为了让它看起来更有人间烟火气一点,有一些常用的初始配置,这里整理一下。 修改页脚 页脚这里默认会显示Powered by Wordpress,还有一个原因是这里要加上备案信息。在主题里找到页脚&…

android framework ams/wms常见系统日志(main\system\events\crash,protoLog使用)

重要性 wms和ams的一些系统原生日志能够帮助我们快速定位问题日志分类 在日常framework工作中常见的日志类别如下: -b , --buffer= Request alternate ring buffer, ‘main’, ‘system’, ‘radio’, ‘events’, ‘crash’, ‘default’ or ‘all’. Additionally, ‘kerne…

压缩指令的使用

gzip 和 gunzip 是两个用于压缩和解压缩文件的命令。 下面是这两个命令的一些基本信息和使用技巧: gzip 压缩 基本语法 gzip 文件名功能描述:压缩文件,只能将文件压缩成 .gz 格式的文件。 经验技巧 只能压缩文件,不能压缩目…