【LeetCode二叉树#12】合并二叉树(巩固层序遍历)
合并二叉树
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 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】合并二叉树(巩固层序遍历)的更多相关文章
- 代码随想录算法训练营day20 | leetcode ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树
LeetCode 654.最大二叉树 分析1.0 if(start == end) return节点索引 locateMaxNode(arr,start,end) new root = 最大索引对应节 ...
- 【LeetCode】 617. 合并二叉树
题目 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否 ...
- 手写二叉树-先序构造(泛型)-层序遍历(Java版)
如题 先序构造 数据类型使用了泛型,在后续的更改中,更换数据类型只需要少许的变更代码 层序遍历 利用Node类的level属性 所有属性的权限全为public ,为了方便先这么写吧,建议还是用priv ...
- 【剑指offer】不分行从上到下打印二叉树,C++实现(层序遍历)
原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印.例如: 图 不分行从上往下按层打印二叉 ...
- 二叉树(前序,中序,后序,层序)遍历递归与循环的python实现
二叉树的遍历是在面试使比较常见的项目了.对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁.下面做一个小结. 一.中序遍历 前中后序三种遍历方法对 ...
- [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 ...
- [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 ...
- [LeetCode] Binary Tree Level Order Traversal 二叉树层序遍历
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- [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 ...
- [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, ...
随机推荐
- [转贴]Python 中 -m 的典型用法、原理解析与发展演变
在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下: python [-bBdEhiIOqsSuvVWx?] [-c command | -m module- ...
- k8s的内部服务通信
首先看看 k8s 集群中内部各个服务互相访问的方法 Cluster IP Kubernetes以Pod作为应用部署的最小单位.Kubernetes会根据Pod的声明对其进行调度,包括创建.销毁.迁移. ...
- echarts饼图中央自定义文字
var option = { tooltip: { trigger: 'item' }, legend: { top: '5%', left: 'center' }, //中央自定义文字 title: ...
- CF676C 题解
使用尺取法(双指针法). 由于字符种类只有 \(2\) 种,答案一定是全 a 或全 b. 情况 \(1\):全 a 快指针循环移动,并统计字符 b 的数量 \(cntb\),直到 \(cntb\) 即 ...
- 渗透学习笔记(cookies、XSS注入)
1.cookie 插件:cookie-editor JavaScript语法: 获取:document.cookie; 设置:document.cookie="username=felix& ...
- 小样本学习在文心ERNIE3.0多分类任务应用--提示学习
小样本学习在文心ERNIE3.0多分类任务应用(提示学习) 项目链接: https://aistudio.baidu.com/aistudio/projectdetail/4438610?contri ...
- PE格式:实现ELF结构解析工具
ELF文件格式,是一个开放的可执行文件和链接文件格式,其主要工作在Linux系统上,是一种用于二进制文件.可执行文件.目标代码.共享库和核心转储格式文件,ELF文件格式类似于PE格式,但比起PE结构来 ...
- Python 代码推送百度链接
通过代码实现抓取个人博客中某一页指定文章链接,并批量将该链接推送到百度站长平台,起到快速收录的目的. import sys import requests from bs4 import Beauti ...
- P7907 [Ynoi2005] rmscne题解
题目链接:rmscne 神仙经典数据结构难题.看到求区间种类数有关的东西,需要下意识的反应到经典老题 HH的项链,这里可以学习我这篇 题解.具体学习下扫描线怎么做这类东西的. 看看本题,首先处理区间查 ...
- Mac基于VMware安装CentOS
流程偏长,下一步根本点不完: 01 首先,明确下两款软件的版本信息: VMware是[VMware-Fusion-13.5.0] CentOS是[CentOS-7-x86_64-Minimal-190 ...