合并二叉树

力扣题目链接(opens new window)

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

示例 1:

注意: 合并必须从两个树的根节点开始。

递归法

思路

这题的主要疑问就是:怎么同时遍历两个树?

其实解题模板已经给提示了,我们同时传入两个树的根节点即可

然后具体思路如下:

选择一颗树作为主树,另一颗往主树上合并(假设选择Tree1)

我们先判断Tree1、Tree2是否存在

如果Tree1不存在,那么合并结果直接为Tree2

如果Tree2不存在,那么合并结果直接为Tree1

如果都存在,则修改主树的值(即将Tree2节点的值与Tree1对应节点的值相加),返回主树的节点

然后调用递归函数,将Tree1的左子节点和Tree2的左子节点继续按上述方式处理。右子节点同理

代码
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
//确定结束条件
//判断两颗树是否都存在
if(root1 == NULL) return root2;
if(root2 == NULL) return root1; //都存在就合并(以root1为主树)
//定义一个新节点,不修改原树结构
TreeNode* root = new TreeNode(0);
root->val = root1->val + root2->val; //确定单层处理逻辑
//调用递归函数
root->left = mergeTrees(root1->left, root2->left);
root->right = mergeTrees(root1->right, root2->right);
return root;
}
};

注意,返回值一般出现在终止位置或者递归之后

迭代法

大体思想,参考判断对称二叉树的迭代法版本以及层序遍历

思路

说一下步骤吧

1、仍然是判断两棵树是否存在

2、创建队列,加入两棵树的根节点

3、遍历队列取出节点,设定一颗树为主树,将另一颗树的val叠加至主树上

4、分别判断此时root1、root2的左、右子节点是否存在,存在就加入队列

5、判断主树的左、右子节点是否为空,为空要用另一颗树的节点去补

代码
class Solution {//使用迭代法,层序遍历
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
//判断两棵树是否存在
if(root1 == NULL) return root2;
if(root2 == NULL) return root1;
//创建队列
queue<TreeNode*> que;
//将根节点加入队列(原教旨主义层序遍历的做法)
que.push(root1);
que.push(root2);
//遍历队列
while(!que.empty()){
//取出队列中的节点
TreeNode* node1 = que.front();
que.pop();
TreeNode* node2 = que.front();
que.pop(); //先将root2的值合并到root1
node1->val += node2->val; //判断root1、root2的左子节点是否都存在
if(node1->left != NULL && node2->left != NULL){
que.push(node1->left);
que.push(node2->left);
}
//判断root1、root2的右子节点是否都存在
if(node1->right != NULL && node2->right != NULL){
que.push(node1->right);
que.push(node2->right);
} //如果root1的左子节点不存在,root2的存在,将root2的值赋过去(注意,这里是以root1为主树)
if(node1->left == NULL && node2->left != NULL){
node1->left = node2->left;
} //如果root1的左子节点不存在,root2的存在,将root2的值赋过去
if(node1->right == NULL && node2->right != NULL){
node1->right = node2->right;
} }
return root1;//root1为主树
}
};

注意区分最后返回的节点,应该返回输入的根节点(并且是主树的根节点),而不是队列中取出的

【LeetCode二叉树#12】合并二叉树(巩固层序遍历)的更多相关文章

  1. 代码随想录算法训练营day20 | leetcode ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

    LeetCode 654.最大二叉树 分析1.0 if(start == end) return节点索引 locateMaxNode(arr,start,end) new root = 最大索引对应节 ...

  2. 【LeetCode】 617. 合并二叉树

    题目 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否 ...

  3. 手写二叉树-先序构造(泛型)-层序遍历(Java版)

    如题 先序构造 数据类型使用了泛型,在后续的更改中,更换数据类型只需要少许的变更代码 层序遍历 利用Node类的level属性 所有属性的权限全为public ,为了方便先这么写吧,建议还是用priv ...

  4. 【剑指offer】不分行从上到下打印二叉树,C++实现(层序遍历)

    原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印.例如: 图  不分行从上往下按层打印二叉 ...

  5. 二叉树(前序,中序,后序,层序)遍历递归与循环的python实现

    二叉树的遍历是在面试使比较常见的项目了.对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁.下面做一个小结. 一.中序遍历 前中后序三种遍历方法对 ...

  6. [LeetCode] Binary Tree Level Order Traversal II 二叉树层序遍历之二

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  7. [LeetCode] Binary Tree Zigzag Level Order Traversal 二叉树的之字形层序遍历

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  8. [LeetCode] Binary Tree Level Order Traversal 二叉树层序遍历

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  9. [LeetCode] 103. Binary Tree Zigzag Level Order Traversal 二叉树的之字形层序遍历

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  10. [LeetCode] 102. Binary Tree Level Order Traversal 二叉树层序遍历

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

随机推荐

  1. 京东小程序CI工具实践

    作者:京东物流 张俊峰 本文从整体介绍了京东小程序CI工具的用途及工作流程,读者可以通过本文了解到一种全新的京东小程序上传方式,同时结合构建脚本和流水线,可大大提高小程序的部署和发布效率. 01 前言 ...

  2. cookie的设置读取

    <script> // 设置cookie值哈 let username = '我是cookie' document.cookie = "name=" + usernam ...

  3. vm-storage在全部都是新metric情况下的写入性能测试

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 vm-storage中,写入索引的性能要比写入data p ...

  4. MySQL存储过程、索引、分表对比

    MySQL存储过程.索引和分表是用于提高查询效率的三种不同方法,它们各自对查询效率有不同的影响和应用场景.以下是它们的对比: MySQL存储过程: 影响查询效率: 存储过程通常不直接影响查询效率,因为 ...

  5. 设计模式学习-使用go实现命令模式

    命令模式 定义 优点 缺点 适用范围 代码实现 命令模式对比策略模式 参考 命令模式 定义 命令模式(Command):将一个请求封装成一个对象,从而是你可用不同的的请求对客户进行参数化:对请求排队或 ...

  6. C# 静态与动态数组

    在C#中,有许多内置的方法可以处理字符和字符串.这些方法是非常有用的,可以帮助开发人员更方便.更高效地处理文本数据.无论是静态数组还是动态数组,都可以使用System.Array类中的各种方法对数组进 ...

  7. 使用.NET Core实现不同服务器SQL Server 数据库同步方案

    代码片段: 1 using DataSync.Core; 2 using Furion.Logging.Extensions; 3 using Microsoft.Data.SqlClient; 4 ...

  8. 关于Windows11的优化内容 - 进阶者系列 - 学习者系列文章

    这几天无事,想起上次刚重装的Windows 11操作系统,对于系统优化的内容想记录一下,以前没写过相关的博文,这次就做个记录吧.对于Windows 11,已经出来几年了,相关的设置啥的也有,就是优化方 ...

  9. C++小项目|2022期末大作业

    前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm=1001.2014. ...

  10. 【双指针】双指针算法详解两道经典OJ【力扣27,力扣26,力扣38】超详细算法教程

    [双指针]双指针算法详解两道经典OJ[力扣27,力扣26,力扣38]超详细算法教程 今天又又到了我们刷力扣题的时间啦! 今天博主给大家带来的三道题是: 27. 移除元素 26. 删除有序数组中的重复项 ...