![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6f655daf630a8bc9451586d6c2c5edaa.png)
方法一:深度优先搜索
思路:
从根节点出发,同时遍历两棵二叉树,将对应的节点进行合并
两棵二叉树对应的节点分为三种情况:
1. 两个对应的节点都为空,则合并后的节点也为空
2. 两个对应的节点其中有一个为空,则合并后的节点为非空的节点
3. 两个对应的节点都不为空,则合并后的节点为两个非空节点的值之和
递归过程:
对两棵树的一个节点进行合并之后,还要对其左子树和右子树进行合并
1. 如果节点一为空,则返回节点二
2. 如果节点二为空,则返回节点一
3. 如果都不为空,将节点一和节点二的值相加,创建一个新节点
4. 分别合并节点的左子树和右子树
5. 返回新节点
代码:
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2)
{
if(root1==null)
{
return root2;
}
if(root2==null)
{
return root1;
}
TreeNode newNode=new TreeNode(root1.val+root2.val);
newNode.left=mergeTrees(root1.left,root2.left);
newNode.right=mergeTrees(root1.right,root2.right);
return newNode;
}
}
方法二:广度优先搜索
思路:
首先判断这两棵树是否为空。
如果都不为空:
首先计算两个队列合并后的根节点的值,然后从合并后的二叉树和原本的两个二叉树开始分别进行广度优先搜索,从根节点开始遍历每个二叉树,合并对应的节点
具体:
用三个队列分别存放三个二叉树的节点
一开始先将三个二叉树的根节点加入队列,然后进入循环
循环:
分别从三个队列中取出一个节点,判断两个二叉树节点的左子节点是否为空。
如果两个左子节点不都为空,则合并后的二叉树的对应节点的左子节点也不为空。右子节点同理。
对于两个左子节点不都为空,有两种情况:
1. 其中一个为空,一个不为空。
合并后的二叉树的对应节点的左子树即为非空的左子树(无需再遍历该子树)
因此不需将该左子节点加入队列
2. 两个左子节点都不为空。
合并后的二叉树的对应节点左子节点值为两个左子节点的值之和,再将当前左子节点加入队列中
代码:
class Solution
{
public TreeNode mergeTrees(TreeNode root1, TreeNode root2)
{
if(root1==null)
{
return root2;
}
if(root2==null)
{
return root1;
}
TreeNode node=new TreeNode(root1.val+root2.val);
Queue<TreeNode> tree1=new LinkedList<>();
Queue<TreeNode> tree2=new LinkedList<>();
Queue<TreeNode> newTree=new LinkedList<>();
tree1.offer(root1);
tree2.offer(root2);
newTree.offer(node);
while(!tree1.isEmpty()&&!tree2.isEmpty())
{
TreeNode node1=tree1.poll();
TreeNode node2=tree2.poll();
TreeNode newNode=newTree.poll();
if(node1.left==null&&node2.left==null)
{
newNode.left=null;
}
else
{
if(node1.left==null)
{
newNode.left=node2.left;
}
else if(node2.left==null)
{
newNode.left=node1.left;
}
else
{
newNode.left=new TreeNode(node1.left.val+node2.left.val);
tree1.offer(node1.left);
tree2.offer(node2.left);
newTree.offer(newNode.left);
}
}
if(node1.right==null&&node2.right==null)
{
newNode.right=null;
}
else
{
if(node1.right==null)
{
newNode.right=node2.right;
}
else if(node2.right==null)
{
newNode.right=node1.right;
}
else
{
newNode.right=new TreeNode(node1.right.val+node2.right.val);
tree1.offer(node1.right);
tree2.offer(node2.right);
newTree.offer(newNode.right);
}
}
}
return node;
}
}