首页 > 其他分享 >23_合并二叉树

23_合并二叉树

时间:2023-12-22 21:13:17浏览次数:41  
标签:right TreeNode 23 合并 t2 t1 二叉树 return left

617. 合并二叉树

给你两棵二叉树: root1root2

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

返回合并后的二叉树。

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

[思路]

递归

1、确定递归函数的参数和返回值:

首先要合入两个二叉树,那么参数至少是传入两个二叉树的根节点,返回值就是合并之后二叉树的根节点。

TreeNode merageTrees(TreeNode t1, TreeNode t2){}

2、确定终止条件:

因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了(如果t2也为NULL也无所谓,合并之后就是NULL)。

反过来如果t2 == NULL,那么两个数合并就是t1(如果t1也为NULL也无所谓,合并之后就是NULL)。

if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1

3、确定单层递归的逻辑:

单层递归的逻辑就是重复利用t1这个树,t1就是合并之后树的根节点(就是修改了原来树的结构)。

单层递归中,就是把两颗树的元素加到一起。

t1.val += t2.val;

接下来t1的左子树是:合并t1左子树 t2左子树之后的左子树

t1的右子树是:合并t1右子树 t2右子树之后的右子树

最终t1就是合并之后的根节点。

代码如下:

t1.left = mergeTrees(t1.left, t2.left);
t1.right = mergeTrees(t1.right, t2.right);
return t1;

前序遍历整体代码如下:

class Solution {
    TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
        if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1
        // 修改了t1的数值和结构
        t1.val += t2.val;                             // 中
        t1.left = mergeTrees(t1.left, t2.left);      // 左
        t1.right = mergeTrees(t1.right, t2.right);   // 右
        return t1;
    }
}
class Solution {
    TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
        if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1
        // 修改了t1的数值和结构
        t1.val += t2.val;                             // 中
        t1.left = mergeTrees(t1.left, t2.left);      // 左
        t1.right = mergeTrees(t1.right, t2.right);   // 右
        return t1;
    }
}

中序遍历

class Solution {
    TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
        if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1
        // 修改了t1的数值和结构
        t1.left = mergeTrees(t1.left, t2.left);      // 左
        t1.val += t2.val;                            // 中
        t1.right = mergeTrees(t1.right, t2.right);   // 右
        return t1;
    }
}

后序遍历

class Solution {
    TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
        if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1
        // 修改了t1的数值和结构
        t1.left = mergeTrees(t1.left, t2.left);      // 左
        t1.right = mergeTrees(t1.right, t2.right);   // 右
        t1.val += t2.val;                            // 中
        return t1;
    }
}

本题使用前、中、后序遍历都可以。

若不改变t1的结构,当然也可以不修改t1和t2的结构,重新定义一个树。

不修改输入树的结构,前序遍历,代码如下:

class Solution {
	TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
		if (t1 == null)  return t2;
		if (t2 == null)  return t1;
		//重新定义新的节点,不修改原有两个树的结构
		TreeNode root = new TreeNode(0);
		root.val = t1.val + t2.val;
		root.left = mergeTrees(t1.left, t2.left);
		root.right = mergeTrees(t1.right, t2.right);
		return root;
	}
}

迭代法

class Solution {
	//使用栈迭代
	public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if (root1 == null) {
            return root2;
        }
        if (root2 == null) {
            return root1;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root2);
        stack.push(root1);
        while (!stack.isEmpty()) {
            TreeNode node1 = stack.pop();
            TreeNode node2 = stack.pop();
            node1.val += node2.val;
            if (node2.right != null && node1.right != null) {
                stack.push(node2.right);
                stack.push(node1.right);
            } else {
                if (node1.right == null) {
                    node1.right = node2.right;
                }
            }
            if (node2.left != null && node1.left != null) {
                stack.push(node2.left);
                stack.push(node1.left);
            } else {
                if (node1.left == null) {
                    node1.left = node2.left;
                }
            }
        }
        return root1;
    }
}

标签:right,TreeNode,23,合并,t2,t1,二叉树,return,left
From: https://www.cnblogs.com/codingbao/p/17922356.html

相关文章

  • [Halcon] 2023.2月license分享(关注持续更新)
    作者:丶布布友情提示:Halcon18以下版本不再提供HDevelop试用授权License(只有运行License需要配合加密狗),请大家升级到最新版本!Halcon是一款商业化的视觉程序,它封装了很多方便的强大的图像处理算法,很多视觉项目都有用它,与visionpro一样,都是一款商业化的软件,加密狗相当的贵,不过Halcon......
  • 代码随想录算法训练营第十天 | 栈与队列理论基础,232.用栈实现队列,225.用队列实现栈
    一、栈与队列理论基础学习:1.定义栈先进后出队列先进先出2.底层实现均可以通过数组或链表进行实现二、232.用栈实现队列题目链接:LeetCode232.用栈实现队列学习前:思路:无学习后:不同方法有部分功能实现是一致的,则可以进行抽象提取,实现复用性两个栈实现队列时......
  • 2023常见自动化测试工具集合
    1、Appium------->AppUI自动化测试官网:http://appium.ioAppium是一个移动端自动化测试开源工具,支持iOS和Android平台,支持Python、Java等语言,即同一套Java或Python脚本可以同时运行在iOS和Android平台,Appium是一个C/S架构,核心是一个Web服务器,它提供了一套REST的......
  • 带你分析 12306 系统设计
    1业务复杂度高于淘宝1.1动态库存上海-南京-北京:买上海-北京,就是一张票买上海-南京,南京-北京,就是两张票1.2选座功能下完单还能选座位1.3线上+线下淘宝只能线上。1.4不停刷票即使没票了,还是会被刷。持续高并发业务,需要更综合的高并发设计。1.5杜绝超卖2业务量......
  • AtCoder 杂题精选(2023 年末)
    [ABC324G]GenerateArrays第一次知道AtCoder还有这种数据结构题。首先,所谓的“切分序列”是假,实际上只需要记录每个操作后,具体取到的原始数组的值域、下标域是什么。对于给定的下标域,求值域内数的个数,可以使用可持久化线段树,很类似区间第\(k\)大数的思路。对于操作一,考虑......
  • 2023最新高级难度Rust面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-高级难度Rust面试题合集问:请解释Rust中的并行计算模型和分布式计算模型。在Rust中,你可以利用语言的并发特性来实现并行计算和分布式计算。虽然这些概念是不同的,但它们可以一起使用以提高系统的性能和扩展性。并行计算并行计算是......
  • 2023最新初级难度Ruby面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-初级难度Ruby面试题合集问:什么是Ruby语言?请简要介绍一下Ruby的特点和用途。Ruby是一种面向对象的、动态类型的脚本语言,由日本人松本行弘(YukihiroMatsumoto)于1993年开发。它的设计目标是简单、易读和易于编写,同时具有强大的功能和优雅......
  • ISCTF2023部分题解
    WEB:圣杯战争!!!(题解:结局别说遗憾Zn.)解题思路:打开题目链接,代码如下:<?phphighlight_file(__FILE__);error_reporting(0);classartifact{public$excalibuer;public$arrow;publicfunction__toString(){echo"为Saber选择了对的武器!<br>";return$this->excal......
  • 199. 二叉树的右视图(中)
    目录题目题解:BFS题目给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。题解:BFS用BFS,每一层最后一个弹出队列的元素加到结果列表里面classSolution:defrightSideView(self,root:Optional[TreeNode])->Lis......
  • 强网杯2023 谍影重重3.0 wp
    参考文章:[使用主动探测方法识别U2hhZG93c29ja3M=(base64)服务-Phuker'sBlog]:https://phuker.github.io/posts/U2hhZG93c29ja3M=-active-probing.html(自行修改url中base64后的敏感词)题目描述:小明被我国抓获之后对所作所为供认不讳,在对他个人电脑监控的过程中,发现存在通......