合并二叉树

103 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

合并二叉树

题目

给你两棵二叉树: root1root2

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

返回合并后的二叉树。

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

示例 1:

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

示例 2:

输入:root1 = [1], root2 = [1,2] 输出: [2,2]

提示:

  • 两棵树中的节点数目在范围 [0, 2000]
  • -104 <= Node.val <= 104

Related Topics

  • 深度优先搜索
  • 广度优先搜索
  • 二叉树

题目分析

这道题主要考察都二叉树的遍历,使用的思想就是深度优先遍历

代码实现

这是代码的实现:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if (root1 == null || root2 == null) {
            return  root1==null? root2 : root1;
        }
        return dfs(root1,root2);
    }

    TreeNode dfs(TreeNode t1,TreeNode t2) {
        if (t1 == null || t2 == null) {
            return t1==null? t2 : t1;
        }
        t1.val += t2.val;
        t1.left = dfs(t1.left,t2.left);
        t1.right = dfs(t1.right,t2.right);
        return t1;
    }
}

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉合并二叉树的实现和深度优先遍历的使用和操作。

对于深度优先算法,前几天的文章中也有提及,这里就不说太多了,除了使用深度优先算法,其他的使用递归和栈也是可以实现的。

小知识

判断一个对象是不是垃圾有两种方法,引用计数法和可达性分析,而引用计数法和可达性分析,引用计数法会出现相互引用的问题,这样对象就无法被回收,所以没有采用这个,而是采用了可达性分析,可达性分析是从GCRoot进行搜索,当对象的GCRoot没有任何引用链的时候,就表示这个对象不可用了可以被回收。GCRoot的对象有虚拟机栈中用到的对象,方法的常量引用的对象,方法的静态属性引用的对象和本地方法栈JNI引用的对象,JNI就是native方法

总结

本篇文章主要解决了合并二叉树的问题,对于二叉树的合并方法也有很多,也可以使用广度优先遍历或者栈递归等,同时讲了一下怎么判断一个对象是不是垃圾,对于递归实现这个功能感兴趣的小伙伴们尝试自行解决实现一下吧,嘿嘿,多动脑,勤思考。