Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目:给定两棵二叉树: 分别记为root1 和 root2 。假设将两棵二叉树进行覆盖,那么两颗二叉树中一些节点的值将会覆盖,而如果存在一边为空,则此另一颗二叉树则不会覆盖,现要求对这两颗二叉树进行合并。设定合并的规则是:如果两个节点存在重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,节点不为 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;
}
上述代码时间复杂度为,空间复杂度也是。
本题还可以使用另一种思路,使用两个栈分别遍历两棵树,每次同时弹出一个节点进行处理,之和对左右子树判空,非空则入栈,空也入栈,不过是以一个标识入栈,之后循环此操作即可,代码就不演示了。