C/C++ BM32 合并二叉树

news/2024/9/25 19:14:44/

文章目录

  • 前言
  • 题目
  • 解决方案一
    • 1.1 思路阐述
    • 1.2 源码
  • 解决方案二
    • 2.1 思路阐述
    • 2.2 源码
  • 总结

前言

树的题目大概率是要用到递归的,将一个树的问题拆分成子树的问题,不断拆分。
这题也用到了递归的思想。


题目

已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如:
两颗二叉树是:
在这里插入图片描述

tree1

在这里插入图片描述

tree2

在这里插入图片描述

合并后的树

数据范围:树上节点数量满足 0 ≤ n ≤ 500 0≤n≤500 0n500,树上节点的值一定在32位整型范围内。
进阶:空间复杂度 O ( 1 ) O(1) O(1),时间复杂度 O ( n ) O(n) O(n)

示例1
输入:{1,3,2,5},{2,1,3,#,4,#,7}
返回值:{3,4,5,5,4,#,7}

示例2
输入:{1},{}
返回值:{1}

解决方案一

1.1 思路阐述

按照题目意思来,这里我一开始审题出现了点问题。题目说的是都存在的节点,我理解存在的节点值。其实题目的意思是,如果根两棵树都存在根节点,那么这两棵树的根节点的值相加。如果两棵树根节点的左节点一棵树存在,一棵树不存在,那么保留存在左节点的那棵树对应的节点。

题目意思理顺了,做的时候就是一个遍历节点的过程了,这里要主要条件的判断。

两种情况:
两棵树没有根节点,返回空;一棵树有节点一棵树没有,返回有节点的那棵树。

当两个节点都存在时,值相加。然后对左右子树执行相同的操作。
这里需要将一棵树作为基本树用来返回。

1.2 源码

/*** struct TreeNode {*  int val;*  struct TreeNode *left;*  struct TreeNode *right;*  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/
class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param t1 TreeNode类* @param t2 TreeNode类* @return TreeNode类*/TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {//如果两棵树的根节点都是空则返回if (!t1 && !t2)return nullptr;//以t1为基树,t2为比较树if (!t1)return t2;if (!t2)return t1;t1->val += t2->val;t1->left = mergeTrees(t1->left, t2->left);t1->right = mergeTrees(t1->right, t2->right);return t1;}
};

解决方案二

2.1 思路阐述

上面我写的代码是前序遍历的方式,比较简单。下面这种事官方贴的层次遍历的方法。供参考。

知识点:队列

队列是一种仅支持在表尾进行插入操作、在表头进行删除操作的线性表,插入端称为队尾,删除端称为队首,因整体类似排队的队伍而得名。它满足先进先出的性质,元素入队即将新元素加在队列的尾,元素出队即将队首元素取出,它后一个作为新的队首。

思路:

除了递归的遍历以外,非递归的层次遍历,也可以实现两棵树同步遍历节点相加,重点是两棵树从根节点开始每个节点是同步走的,因此我们可以使用队列辅助两个二叉树分别同时层次遍历。

具体做法:

step 1:首先判断t1与t2是否为空,若为则用另一个代替,若都为空,返回的值也是空。
step 2:使用三个辅助队列,第一个队列q用于暂存合并后的二叉树的层次遍历节点,第二个队列q1用于暂存t1的层次遍历节点,第三个队列q2用于暂存t2的层次遍历节点。
step 3:两棵树同步层次遍历,先将根节点加入队列中,同时根节点优先合并。
step 4:每次从队列分别弹出一个元素,判断分别二者的左右子节点是否存在,若是都存在,则相加合并,若是只存在一个则连接该存在的节点,若是都不存在则连接null。

2.2 源码

class Solution {
public:TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {//若只有一个节点返回另一个,两个都为NULL自然返回NULLif (t1 == NULL)return t2;if (t2 == NULL)return t1;//合并根节点TreeNode* head = new TreeNode(t1->val + t2->val); //连接后的树的层次遍历节点queue<TreeNode*> q; //分别存两棵树的层次遍历节点queue<TreeNode*> q1; queue<TreeNode*> q2;q.push(head);q1.push(t1);  q2.push(t2);while (!q1.empty() && !q2.empty()) {TreeNode *node = q.front(), *node1 = q1.front(), *node2 = q2.front();q.pop();q1.pop();q2.pop();TreeNode *left1 = node1->left, *left2 = node2->left, *right1 = node1->right, *right2 = node2->right;//两个左节点都存在if (left1 || left2) { if (left1 && left2) {TreeNode* left = new TreeNode(left1->val + left2->val);node->left = left; //新节点入队列q.push(left); q1.push(left1);q2.push(left2);//只连接一个节点} else if (left1) node->left = left1;else if (left2) node->left = left2;}if (right1 || right2) {//两个右节点都存在if (right1 && right2) { TreeNode* right = new TreeNode(right1->val + right2->val);node->right = right;//新节点入队列q.push(right); q1.push(right1);q2.push(right2);//只连接一个节点} else if (right1)  node->right = right1;else node->right = right2;}}return head;}
};

总结

树相关的东西,几种遍历方式要烂熟于心。还有就是递归一般都是优先解法。


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

相关文章

Spring Boot面试知识点总结(经典15问)

Spring Boot面试知识点总结&#xff08;问答合集&#xff09; 文章目录 Spring Boot面试知识点总结&#xff08;问答合集&#xff09;一、Spring Boot简介二、核心特性三、面试问题及答案问题1&#xff1a;Spring Boot的核心配置文件是什么&#xff1f;问题2&#xff1a;Spring…

近几年视频取证、视频篡改检测技术发展现状及挑战

前言 本文主要搜集了视频取证各个子领域近几年的高影响因子/引用数的文章及其主要思想和做法&#xff0c;旨在分析目前视频篡改检测的发展现状与热点领域&#xff0c;文章中也融合了自己的一点看法和展望&#xff0c;欢迎感兴趣的同学和我多多沟通。 本文无论是文献搜集还是方…

深入浅出一文图解Vision Mamba(ViM)

文章目录 引言&#xff1a;Mamba第一章&#xff1a;环境安装1.1安装教程1.2问题总结1.3安装总结 第二章&#xff1a;即插即用模块2.1模块一&#xff1a;Mamba Vision代码&#xff1a;models_mamba.py运行结果 2.2模块二&#xff1a;MambaIR代码&#xff1a;MambaIR运行结果 第三…

Messari 报告摘要 :Covalent Network(CQT)2024 年第一季度表现

摘要&#xff1a; 尽管 CQT 代币流通供应量增加了 20%&#xff08;新增 1.04 亿枚 CQT&#xff09;&#xff0c;但 CQT 的质押百分比仅从 2023 年第一季度的 22% 增长到了 2024 年第一季度的 29%。 CQT 的市值季度环比增长了 28%&#xff0c;多次达到 2.75 亿美元&#xff0c…

【百度Apollo】探索自动驾驶:小白教学如何使用 Dreamview 播放数据包

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、Dreamview 简介二、使用 Dreamview 具体步骤步骤一&#xff1a;进入 Apollo Docker 环境步骤二&#xff…

基于深度学习的3D目标检测与跟踪

目标检测和跟踪对于自动驾驶来说是至关重要和基础的任务&#xff0c;旨在从场景中识别和定位出那些预定义类别的对象。在所有形式的自动驾驶数据中&#xff0c;3D点云学习引起了越来越多的关注。目前&#xff0c;有许多用于3D目标检测的深度学习方法。然而&#xff0c;鉴于点云…

会声会影2024中文旗舰版最新网盘安装包下载

会声会影2024是一款功能强大的视频编辑软件&#xff0c;它凭借直观易用的界面、全面的编辑工具以及丰富的特效库&#xff0c;吸引了广泛的用户群体。无论是视频编辑初学者还是专业人士&#xff0c;都能在这款软件中找到满足自己创作需求的功能。 一、软件概述 会声会影2024继承…

实现优先队列——C++

目录 1.优先队列的类模板 2.仿函数的讲解 3.成员变量 4.构造函数 5。判空&#xff0c;返回size&#xff0c;返回队头 6.插入 7.删除 1.优先队列的类模板 我们先通过模板来进行初步了解 由上图可知&#xff0c;我们的模板里有三个参数&#xff0c;第一个参数自然就是你要存储的数…