题目描述:

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

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

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



输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]

输出:[3,4,5,5,4,null,7]

思路分析:

这个题目是第一次遇到的同时处理两个二叉树的问题。但是和单颗二叉树处理方法类似的关键在于:合并两个二叉树,如果树的结果一致,直接合并,不一致的时候,比如root1没有左子树,root2有。则直接root1.Right = root2.Right即可。

下面是一个自顶向下的递归实现,当遍历到某个树的叶子节点就return。

点击查看代码
func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
if root1==nil{
return root2
}
if root2 == nil {
return root1
}
root1.Val+=root2.Val
root1.Left = mergeTrees(root1.Left,root2.Left)
root1.Right = mergeTrees(root1.Right,root2.Right)
return root1
}

迭代做法

用层序遍历来解决这个问题,当两棵树的每层都是满的时候才进行层序入队,某则就是某颗有空树,就直接进行拼接,不能进行入队操作。

点击查看代码
func mergeTrees(t1 *TreeNode, t2 *TreeNode) *TreeNode {
// 如果 t1 为空,直接返回 t2
if t1 == nil {
return t2
}
// 如果 t2 为空,直接返回 t1
if t2 == nil {
return t1
} // 初始化队列
que := []*TreeNode{t1, t2}
// 使用队列进行层次遍历
for len(que) > 0 {
// 从队列中弹出两个节点
node1 := que[0]
que = que[1:]
node2 := que[0]
que = que[1:] // 合并两个节点的值
node1.Val += node2.Val // 如果两个树的左节点都不为空,加入队列
if node1.Left != nil && node2.Left != nil {
que = append(que, node1.Left, node2.Left)
}
// 如果 t1 的左节点为空而 t2 的左节点不为空,就赋值过去
if node1.Left == nil && node2.Left != nil {
node1.Left = node2.Left
} // 如果两个树的右节点都不为空,加入队列
if node1.Right != nil && node2.Right != nil {
que = append(que, node1.Right, node2.Right)
}
// 如果 t1 的右节点为空而 t2 的右节点不为空,就赋值过去
if node1.Right == nil && node2.Right != nil {
node1.Right = node2.Right
}
}
return t1
}

617. 合并二叉树 Golang实现的更多相关文章

  1. LeetCode 617. 合并二叉树(Merge Two Binary Trees)

    617. 合并二叉树 617. Merge Two Binary Trees 题目描述 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新 ...

  2. Java实现 LeetCode 617 合并二叉树(遍历树)

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

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

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

  4. Leetcode 617.合并二叉树

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

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

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

  6. 每日一题-——LeetCode(617) 合并二叉树

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

  7. [LeetCode]617. 合并二叉树(递归)

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

  8. LeetCode 617. 合并二叉树 Java

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

  9. leadcode的Hot100系列--617. 合并二叉树

    合并,就是两个树的结构交集部分,数据相加,否则,取非空部分. 所以,这里相当于是对两棵树同时遍历: 如果两棵树节点都不为空,则数据相加, 否则,直接指针把不为空的节点复制过来. 注:这里没有申请内存, ...

  10. [LeetCode] 617. Merge Two Binary Trees 合并二叉树

    Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...

随机推荐

  1. 我的 mac 生产力工具

    应用名称 说明 安装命令 Homebrew mac 上的强大包管理器 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com ...

  2. 万丈高楼平地起:UML类图

    UML类图 UML类图 是一种静态的结构图,描述了系统的类的集合,类的属性和类之间的关系,可以简化了人们对系统的理解.UML类图 是系统分析和设计阶段的重要产物,是系统编码和测试的重要模型. 图示 类 ...

  3. mysql bit(1) 字段insert 报错 Data too long

    insert数据时,给bit(1)字段赋值 '1' 报错 将字符串'1',修改为数字1即可

  4. 鸿蒙(Harmony) NEXT - AlphabetIndexer实现联系人字母索引

    鸿蒙(Harmony) NEXT 9月份就要正式上架了,并且不会再兼容安卓平台,于是我也赶紧给App开发鸿蒙版本,接下来会写一系列的Harmony开发教程. 今天使用AlphabetIndexer实现 ...

  5. TypeScript – Get Started Advanced (Work with SystemJS)

    更新 我本来想 skip 掉 bundler (webpack), 感觉单侧不需要搞那么复杂, 所以用了 TypeScript 自带的 bundle (outFile) + SystemJS. 谁知道 ...

  6. CSS & JS Effect – Loading Button

    效果 一个按钮, 点击以后中间出现 loading, 然后旋转. 思路 1. 监听点击, hide text, show loading 2. loading 定位中心 3. loading 是通过 ...

  7. 反DDD模式之“复用”

    本文书接上回<反DDD模式之关系型数据库>,关注公众号(老肖想当外语大佬)获取信息: 最新文章更新: DDD框架源码(.NET.Java双平台): 加群畅聊,建模分析.技术实现交流: 视频 ...

  8. nexus 部署与设置

    安装nexus df -h 先查看目录磁盘空间,我安装的版本占用了四个G 空间,目录文件空间不够导致启动失败 上传 nexus 压缩包,并解压 查询 8081 端口号是否被占用 sudo netsta ...

  9. Linux调度器:进程优先级

    一.前言 本文主要描述的是进程优先级这个概念.从用户空间来看,进程优先级就是nice value和scheduling priority,对应到内核,有静态优先级.realtime优先级.归一化优先级 ...

  10. 批量解压zip文件到指定位置

    话不多说,直接上代码. # coding:utf-8 import zipfile import utils_file n = 21 # 我事先知道我有多少个文件,所以确定为21 for i in r ...