几行代码搞定合并二叉树,但你真的搞懂了吗?

leetcode 617.合并二叉树

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

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

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

先来看看如下代码有什么问题?

//代码1:
class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if(root1 == null) return root2;
        if(root2 == null) return root1;
        //一定要new一个新的根节点,不要直接返回节点,因为我们还要为该节点的子节点赋值
        TreeNode root = new TreeNode(root1.val + root2.val);
        root.left = mergeTrees(root1.left, root2.left);
        root.right = mergeTrees(root1.right, root2.right);
        return root;
    }
}

如果按照这种写法,那么根节点为1+1是没问题的,因为两个根节点都存在,所以合并树的根节点root.val = 2;但是root.left就会需要判断root1.left和root2.left的存在情况,我们可以从图中看出,root1.left是存在的而root2.left是null,此时按照代码逻辑,我们就直接返回root1.left,那root1.left后面的节点还需要考虑吗?答案是不需要的,因为root2.left此时为null,所以它后面就没有节点了。此时,root1.left及其后面的节点在与另一棵树合并的时候就不需要考虑另一棵树了。

不过,为了不借助原树,而是完全的构造一棵新的树,即使刚才这种不用考虑另一棵树的情况出现,我们也最好不要让合并树的节点指向原树节点,体现在代码中,就是return root1/return root2。

所以我又写了如下代码:首先只有当前root1和root2均为null时,我们才返回null;否则,一定有一棵树的root1/root2是不为空的。所以我们构造新树的节点root,其值为root1和root2节点值之和,此时我们将节点为空的root1/root2的值设为0即可避免空指针异常。接下来递归的为root的左右节点赋值,赋值的时候需要传入root1和root2的左/右节点,因为root1/root2可能为空,所以就需要我们在传入参数的时候进行判断,空节点直接传入null值即可避免空指针异常。

//代码2:
class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if(root1 == null && root2 == null) {
            return null;
        }
        TreeNode root = new TreeNode((root1 == null ? 0 : root1.val) + (root2 == null ? 0 : root2.val));
        root.left = mergeTrees((root1 == null ? null : root1.left), root2 == null ? null : root2.left);
        root.right = mergeTrees((root1 == null ? null : root1.right), root2 == null ? null : root2.right);
        return root;
    }
}
posted @   知小  阅读(107)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示