当前位置: 首页 > news >正文

LC617-合并二叉树

文章目录

  • 1 题目描述
  • 2 思路
    • 优化代码
    • 完整输入输出
  • 参考

1 题目描述

https://leetcode.cn/problems/merge-two-binary-trees/description/

给你两棵二叉树: root1 和 root2 。

将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。
合并的规则是:

  • 如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;
  • 否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

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

在这里插入图片描述

2 思路

合并二叉树需要遍历整个树:考虑使用递归遍历

合并多个树,使用递归三部曲:

  1. 确定函数的返回值和参数:返回值,构建好的树;参数,需要构建的两个树
  2. 确定递归结束的条件:
    • 当两个叔都是空的时候,返回空(空)
    • 左子树为空,返回右子树;同样的,右子树为空,返回左子树
  3. 递归的逻辑:
    • 当左右子树都不为空的时候,将两个节点的值相加,然后赋值给一个子树
    • 递归构建左右子树
class Solution{public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {// 递归结束的条件if (root1 == null && root2 == null) {return null;} else if (root1 != null && root2 == null) {return root1;} else if (root1 == null  && root2 != null) {return root2;}// 递归逻辑root1.val += root2.val;root1.left = mergeTrees(root1.left, root2.left);root1.right = mergeTrees(root1.right, root2.right);// 最终的结果return root1;}}

优化代码

对于递归结束的条件,可以进行代码优化;返回树的逻辑可以为:如果一颗树为空,则返回另外一颗,如果领一颗是null则直接结束;如果不是null,则进行了连接

class Solution{public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {// 递归结束的条件if (root1 == null) {return root2;}if (root2 == null) {return root1;}// 递归逻辑root1.val += root2.val;root1.left = mergeTrees(root1.left, root2.left);root1.right = mergeTrees(root1.right, root2.right);// 最终的结果return root1;}}

完整输入输出

  • 使用List存储输入的元素
  • 使用递归构建二叉树
import java.util.*;class TreeNode{int val;TreeNode left;TreeNode right;public TreeNode() {}public TreeNode(int val) {this.val = val; }public TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}}// Solutionpublic class Main {public static void main(String[] args) {// 递归构建二叉树Scanner in = new Scanner(System.in);Solution solution = new Solution();while (in.hasNext()) {String[] strNums1 = in.nextLine().split(" ");String[] strNums2  = in.nextLine().split(" ");List<TreeNode> nodes1 = getTree(strNums1);List<TreeNode> nodes2 = getTree(strNums2);// 构建二叉树TreeNode root1 = constructTree(nodes1);TreeNode root2 = constructTree(nodes2);//TreeNode root = solution.mergeTrees(root1, root2);// 展示结果preorderTree(root);}}public static List<TreeNode> getTree(String[] strNums) {if (strNums.length == 0) return null;List<TreeNode> nodes = new LinkedList<>();for (String strNum: strNums) {if (!strNum.isEmpty()) {if (strNum.equals("null")) {nodes.add(null);} else {nodes.add(new TreeNode(Integer.parseInt(strNum)));}}}return nodes;}public static TreeNode constructTree(List<TreeNode> nodes) {if (!nodes.isEmpty()) {TreeNode node = nodes.remove(0);if (node != null) {node.left = constructTree(nodes);node.right = constructTree(nodes);}return node;}return null;}public static void preorderTree(TreeNode root) {if (root != null) {System.out.print(root.val + " ");preorderTree(root.left);preorderTree(root.right);}}
}
/*
test case:
1 3 5 null null null 2
2 1 null 4 null null 3 null 7r = 3 4 5 4 5 7*/

参考

https://www.programmercarl.com/0617.合并二叉树.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【11】微服务链路追踪SkyWalking
  • Django cursor()增删改查和shell环境执行脚本
  • 分享从零开始学习网络设备配置--任务6.1 实现计算机的安全接入
  • 【数据治理】隐私计算:数据治理中的安全守护者
  • 【Spring Boot 自定义配置项详解】
  • 操作系统:文件
  • SQL Server查询计划阅读及分析
  • 【c++刷题笔记-动态规划】day45: 115.不同的子序列 、583. 两个字符串的删除操作 、 72. 编辑距离
  • Chat-REC——基于 LLM 的推荐系统算法解析
  • Android SurfaceFlinger——创建EGLContext(二十六)
  • Docker部署Elasticsearch8.6.0 Kibana8.6.0
  • rabbitmq生产与消费
  • HTTPServer改进思路1
  • 怎样在 PostgreSQL 中实现数据的异地备份?
  • 微信小程序-CANVAS写入图片素材、文字等数据生成图片
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Date型的使用
  • HTTP中的ETag在移动客户端的应用
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Mocha测试初探
  • Ruby 2.x 源代码分析:扩展 概述
  • Spring框架之我见(三)——IOC、AOP
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • Unix命令
  • web标准化(下)
  • 阿里云应用高可用服务公测发布
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 蓝海存储开关机注意事项总结
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 想写好前端,先练好内功
  • 字符串匹配基础上
  • 【干货分享】dos命令大全
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • 选择阿里云数据库HBase版十大理由
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $nextTick的使用场景介绍
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (arch)linux 转换文件编码格式
  • (libusb) usb口自动刷新
  • (二)换源+apt-get基础配置+搜狗拼音
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (力扣)循环队列的实现与详解(C语言)
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (一)基于IDEA的JAVA基础12
  • (已解决)什么是vue导航守卫
  • (译) 函数式 JS #1:简介
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .