给你两棵二叉树: root1 和 root2 。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
题解
找到相同位置的节点然后合并
如果root1则直接返回root2,root2为空则直接返回root1,不要再进入下一层递归,避免出现空指针异常
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
TreeNode root=new TreeNode(0);
if(root1!=null&&root2!=null) root.val=root1.val+root2.val;
else if(root1!=null&&root2==null) return root1;
else if(root1==null&&root2!=null) return root2;
else return null;
root.left=mergeTrees(root1.left,root2.left);
root.right=mergeTrees(root1.right,root2.right);
return root;
}
}
也可以直接把root2得值加在root1上面,返回root1
class Solution {
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
//1.边界条件判断
if(t1==null) return t2;
else if(t2==null) return t1;
//2.对当前节点应该做的操作:节点值相加
else t1.val+=t2.val;
//3.给当前节点的左节点赋值:对左节点递归进行操作
t1.left= mergeTrees(t1.left,t2.left);
//3.给当前节点的右节点赋值:对左节点递归进行操作
t1.right=mergeTrees(t1.right,t2.right);
//4.返回根节点
return t1;
}
}
错误代码
root1或者root2为空的时候没有直接返回,会进入下一层递归,比如mergeTrees(root1.left,root2.left),这会使得出现空指针异常(null.null)
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
TreeNode root=new TreeNode(0);
if(root1!=null&&root2!=null) root.val=root1.val+root2.val;
else if(root1!=null&&root2==null) root.val=root1.val;
else if(root1==null&&root2!=null) root.val=root2.val;
else return null;
root.left=mergeTrees(root1.left,root2.left);
root.right=mergeTrees(root1.right,root2.right);
return root;
}
}