这是悦乐书的第274次更新,第290篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第142题(顺位题号是617)。提供两个二叉树,将其合并为新的二叉树,也可以在其中一个二叉树上进行覆盖。合并规则是如果两个节点重叠(都不为空),则将节点值加起来作为合并节点的新值。 否则,其中一个不为空的节点将用作新树的节点。例如:

Tree 1                     Tree 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7

合并后的新二叉树:

         3
/ \
4 5
/ \ \
5 4 7

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

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

合并两个二叉树,首先我们需要遍历这两个二叉树的所有节点,其次是选择遍历顺序,是前序、中序还是后序,而题目说了要从根节点开始,那么我们选择前序遍历。二叉树的常规操作有递归、迭代的方法,此处我们选择递归的方法。

直接使用递归,使用前序遍历的方式,遍历t1和t2,顺序为根节点-->左子树-->右子树,将每次处理的节点作为新树的节点。此解法我是将递归方法独立出来了,你也可以直接在原方法里写。

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
return helper(t1,t2);
} public TreeNode helper(TreeNode t1, TreeNode t2){
// 如果t1和t2的当前节点都为空,直接返回null
if (t1 == null && t2 == null) {
return null;
}
// 每次进递归方法里时,都创建一个新节点,当然,你也可以用给的t1或者t2都行
TreeNode t3 = new TreeNode(0);
// 新节点的节点值
t3.val = (t1 == null ? 0 : t1.val)+(t2 == null ? 0 : t2.val);
// 新节点的左子树
t3.left = helper(t1 == null ? null : t1.left, t2 == null ? null : t2.left);
// 新节点的右子树
t3.right = helper(t1 == null ? null : t1.right, t2 == null ? null : t2.right);
return t3;
}
}

03 第二种解法

使用迭代的方法,借助栈来实现,与正常的单个二叉树借助栈来迭代的方法类似,只是在两个二叉树的情况下,多做了一些判断。

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
// 如果t1和t2都为空,直接返回null
if (t1 == null && t2 == null) {
return null;
}
// 如果t2为空,直接返回t1
if (t2 == null) {
return t1;
}
//如果t1为空,直接返回t2
if (t1 == null) {
return t2;
}
// 使用两个栈
Stack<TreeNode> stack = new Stack<TreeNode>();
Stack<TreeNode> stack2 = new Stack<TreeNode>();
stack.push(t1);
stack2.push(t2);
while (!stack.isEmpty() || !stack2.isEmpty()) {
TreeNode temp = stack.pop();
TreeNode temp2 = stack2.pop();
if (temp == null || temp2 == null) {
continue;
}
// 将新的节点值覆盖到t1上去
temp.val = temp.val + temp2.val;
// 如果t1的左子节点为null,那么新的t1的左子节点直接指向t2的左子节点,否则同时入栈
if (temp.left == null) {
temp.left = temp2.left;
} else {
stack.push(temp.left);
stack2.push(temp2.left);
}
// 与上面处理左子节点情况类似
if (temp.right == null) {
temp.right = temp2.right;
} else {
stack.push(temp.right);
stack2.push(temp2.right);
}
}
return t1;
}
}

04 第三种解法

同样是使用迭代的方法,但是我们只使用一个栈,栈中的泛型是二叉树数组。

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
// 如果t1和t2都为空,直接返回null
if (t1 == null && t2 == null) {
return null;
}
// 如果t2为空,直接返回t1
if (t2 == null) {
return t1;
}
//如果t1为空,直接返回t2
if (t1 == null) {
return t2;
}
// 使用一个个栈
Stack<TreeNode[]> stack = new Stack<>();
stack.push(new TreeNode[]{t1, t2});
// 其中的判断规则与上面两个栈的方法类似
while (!stack.isEmpty()) {
TreeNode[] t = stack.pop();
if (t[0] == null || t[1] == null) {
continue;
}
t[0].val += t[1].val;
if (t[0].left == null) {
t[0].left = t[1].left;
} else {
stack.push(new TreeNode[] {t[0].left, t[1].left});
}
if (t[0].right == null) {
t[0].right = t[1].right;
} else {
stack.push(new TreeNode[] {t[0].right, t[1].right});
}
}
return t1;
}
}

05 小结

此题本质上是考察二叉树的前序遍历,及其递归、迭代两种方法的实现,如有不熟悉的,可以去查漏补缺。

算法专题目前已日更超过四个月,算法题文章142+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Merge Two Binary Trees(Java实现)的更多相关文章

  1. LeetCode算法题-Merge Sorted Array(Java实现)

    这是悦乐书的第161次更新,第163篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第20题(顺位题号是88).给定两个排序的整数数组nums1和nums2,将nums2中 ...

  2. LeetCode算法题-Trim a Binary Search Tree(Java实现)

    这是悦乐书的第284次更新,第301篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第152题(顺位题号是669).给定二叉搜索树以及L和R的最低和最高边界,修剪树以使其所 ...

  3. LeetCode算法题-Diameter of Binary Tree(Java实现)

    这是悦乐书的第257次更新,第270篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第124题(顺位题号是543).给定二叉树,您需要计算树的直径长度. 二叉树的直径是树中 ...

  4. LeetCode算法题-Longest Univalue Path(Java实现)

    这是悦乐书的第290次更新,第308篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第158题(顺位题号是687).给定二叉树,找到路径中每个节点具有相同值的最长路径的长度 ...

  5. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  6. LeetCode算法题-Letter Case Permutation(Java实现)

    这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...

  7. LeetCode算法题-Jewels and Stones(Java实现)

    这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...

  8. LeetCode算法题-Reach a Number(Java实现)

    这是悦乐书的第310次更新,第331篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第179题(顺位题号是754).你站在无限数字线的0号位置.在目的地有个target.在 ...

  9. LeetCode算法题-Shortest Completing Word(Java实现)

    这是悦乐书的第309次更新,第330篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第178题(顺位题号是748).从给定的字典单词中查找最小长度单词,其中包含字符串lic ...

随机推荐

  1. 学习-xlsxwriter模块

    Xlsx是python用来构造xlsx文件的模块,可以向excel2007+中写text,numbers,formulas 公式以及hyperlinks超链接. 可以完成xlsx文件的自动化构造,包括 ...

  2. SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1

    在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomca ...

  3. 带着新人学springboot的应用09(springboot+异步任务)

    本来想说说检索的,不过不知道什么鬼,下载ElasticSearch太慢了,还是放一下,后面有机会再补上!今天就说个简单的东西,来说说任务. 什么叫做任务呢?其实就是类中实现了一个什么功能的方法.常见的 ...

  4. 带着萌新看springboot源码11(springboot启动原理 源码上)

    通过前面这么多讲解,springboot原理应该也大概有个轮廓了,一些基本的配置,从客户端url到controller(配置一些要用的组件,servlet三大组件,处理器映射器,拦截器,视图解析器这些 ...

  5. Python模块查找路径

    在编写Python程序时候命名在IDE中运行正常可是到了服务器上就出现各种问题,经常发生的就是如下的错误: ImportError: No module named 'hello' 这个错误我相信大家 ...

  6. 大数据技术之_19_Spark学习_01_Spark 基础解析 + Spark 概述 + Spark 集群安装 + 执行 Spark 程序

    第1章 Spark 概述1.1 什么是 Spark1.2 Spark 特点1.3 Spark 的用户和用途第2章 Spark 集群安装2.1 集群角色2.2 机器准备2.3 下载 Spark 安装包2 ...

  7. RabbitMQ消息队列(三)-Centos7下安装RabbitMQ3.6.1

    如果你看过前两章对RabbitMQ已经有了一定了解,现在已经摩拳擦掌,来吧动手吧! 用什么系统 本文使用的是Centos7,为了保证对linux不太熟悉的伙伴也能轻松上手(避免折在安装的路上),下面是 ...

  8. 启航 - cache2go源码分析

    一.概述 我们今天开始第一部分“golang技能提升”.这一块我计划分析3个项目,一个是很流行的golang源码阅读入门项目cache2go,接着是非常流行的memcache的go语言版groupca ...

  9. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->Web版本新增新的角色授权管理界面效率更高、更规范

    角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...

  10. Linux下安装Tomcat启动报错

    一.报以下错误: Using CATALINA_BASE:   /home/apache-tomcat-7.0.72Using CATALINA_HOME:   /home/apache-tomcat ...