LeetCode 617.合并二叉树

105 阅读2分钟

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

题目:给定两棵二叉树: 分别记为root1root2 。假设将两棵二叉树进行覆盖,那么两颗二叉树中一些节点的值将会覆盖,而如果存在一边为空,则此另一颗二叉树则不会覆盖,现要求对这两颗二叉树进行合并。设定合并的规则是:如果两个节点存在重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,节点不为 null 将直接作为新二叉树的节点。最后返回合并后的二叉树的根节点。

例如:

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

解题思路

题目很简单,解决的方法无非就是将两颗二叉树同时进行遍历,遍历过程中将两颗二叉树按照上述规则进行合并即可。上述规则中不为null的节点将作为新的二叉树节点这一点实际上是一个提示,也即我们只需判断二叉树节点是否为空,如果为空则返回另一个二叉树节点即可,而后序则不需要遍历,此处采用递归事先,代码如下:

public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if(root1 == null) return root2;
        if(root2 == null) return root1;

        TreeNode root = new TreeNode(root1.val+root2.val);
        root.left = mergeTrees(root1.left, root2.left);
        root.right = mergeTrees(root1.right, root2.right);

        return root;
    }

上述代码时间复杂度为O(n)O(n),空间复杂度也是O(n)O(n)

本题还可以使用另一种思路,使用两个栈分别遍历两棵树,每次同时弹出一个节点进行处理,之和对左右子树判空,非空则入栈,空也入栈,不过是以一个标识入栈,之后循环此操作即可,代码就不演示了。