目 录CONTENT

文章目录

Leetcode 617.合并二叉树

小王同学
2024-03-13 / 0 评论 / 0 点赞 / 35 阅读 / 0 字

Leetcode 617.合并二叉树

力扣传送门(opens new window)

给你两棵二叉树: root1root2

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

返回合并后的二叉树。

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

merge.jpg

输入: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]

解题思路:

递归实现
如果没有头绪的话,可以将这两颗树想象成是两个数组:

1 3 2 5
2 1 3 4 7
合并两个数组很直观,将数组 2 的值合并到数组 1 中,再返回数组 1 就可以了。
对于二叉树来说,如果我们像遍历数组那样,挨个遍历两颗二叉树中的每个节点,再把他们相加,那问题就比较容易解决了。

遍历二叉树很简单,用 前序 遍历就可以了,再依次把访问到的节点值相加,因为题目没有说不能改变树的值和结构,我们不用再创建新的节点了,直接将树2合并到树1上再返回就可以了。
需要注意:这两颗树并不是长得完全一样,有的树可能有左节点,但有的树没有。
对于这种情况,我们统一的都把他们挂到树 1 上面就可以了,对于上面例子中的两颗树,合并起来的结果如下:

     3
    / \
   4   5
  / \   \ 
 5   4   7

相当于树1少了一条腿,而树 2 有这条腿,那就把树 2 的拷贝过来。
总结下递归的条件:

以下三个判断语句作为递归调用的终止条件:

  1. if (root1 == null && root2 == null):如果两个根节点都为null,说明两个树都为空,返回null,递归调用终止。
  2. if (root1 != null && root2 == null):如果其中一个根节点不为null,另一个根节点为null,就返回非空的根节点,递归调用终止。
  3. if (root1 == null && root2 != null):如果其中一个根节点为null,另一个根节点不为null,就返回非空的根节点,递归调用终止。

代码的思路是递归地合并两个二叉树。对于每个节点,如果两个树的对应节点都存在,就将它们的值相加作为新节点的值;如果只有一个树的对应节点存在,就直接使用该节点;如果两个树的对应节点都不存在,就返回null。
动画演示如下:

23fbf9388a4193475a7606a6390729f575e3329e0a810d2047682f701d3ddd1f-recursion.gif

时间复杂度:O(N)O(N)O(N)
空间复杂度:O(h)O(h)O(h),hhh 是树的高度

代码实现:

class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if(root1 == null && root2 == null){
            return null;
        }
        if(root1 != null && root2 == null){
            return root1;
        }

        if(root1 == null && root2!=null){
            return root2;
        }
    
        TreeNode treeNode = new TreeNode(root1.val + root2.val);
        treeNode.left = mergeTrees(root1.left,root2.left);
        treeNode.right = mergeTrees(root1.right,root2.right);
        return treeNode;
    }
}
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区