思路:深度优先,从根节点开始同时遍历两个二叉树,并将对应的节点进行合并。
三种情况:
1.如果两个二叉树的对应节点都为空,则合并后的二叉树的对应节点也为空;
2.如果两个二叉树的对应节点只有一个为空,则合并后的二叉树的对应节点为其中的非空节点;
3.如果两个二叉树的对应节点都不为空,则合并后的二叉树的对应节点的值为两个二叉树的对应节点的值之和,此时需要显性合并两个节点。
对一个节点进行合并之后,还要对该节点的左右子树分别进行合并。这是一个递归的过程
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if(root1 == null){
return root2;
}
if(root2 == null){
return root1;
}
// 合并节点
TreeNode newRoot = new TreeNode(root1.val + root2.val);
// 递归合并左子树的结点
newRoot.left = mergeTrees(root1.left, root2.left);
newRoot.right = mergeTrees(root1.right, root2.right);
return newRoot;
}
}
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
return merge(root1, root2);
}
public TreeNode merge(TreeNode root1, TreeNode root2){
if(root1 == null || root2 == null){
return root1 == null ? root2 : root1;
}
int val1 = root1 == null ? 0 : root1.val;
int val2 = root2 == null ? 0 : root2.val;
TreeNode newRoot = new TreeNode(val1 + val2);
newRoot.left = merge(root1.left, root2.left);
newRoot.right = merge(root1.right, root2.right);
return newRoot;
}
}