题目的链接在这里:https://leetcode-cn.com/problems/merge-two-binary-trees/
题目大意
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
一、示意图
二、解题思路
递归和BFS
递归
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
//合并二叉树 两个节点重叠的话 就把两者相加之值作为新值 放入
//首先是递归算法
if(root1==null&&root2==null){
return null;
}
if(root1==null){
return root2;
}
if(root2==null){
return root1;
}
//这边就是两个都不是null的 先新建一个
TreeNode treeNode=new TreeNode();
treeNode.val=(root1.val+root2.val);
//然后再进行递归判断
treeNode.left=mergeTrees(root1.left,root2.left);
treeNode.right=mergeTrees(root1.right,root2.right);
return treeNode;
}
}
bfs
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
//再试试看 BFS
//还是先进行判断吧
if(root1==null){
return root2;
}
if(root2==null){
return root1;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root1);
queue.add(root2);
while (!queue.isEmpty()){
TreeNode treeNode1 = queue.poll();
TreeNode treeNode2 = queue.poll();
treeNode1.val+= treeNode2.val;
// 如果两棵树左节点都不为空 加入队列
if(treeNode1.left!=null&&treeNode2.left!=null){
queue.add(treeNode1.left);
queue.add(treeNode2.left);
}
//如果两棵树的右节点 都不为空 那就加入队列
if(treeNode1.right!=null&&treeNode2.right!=null){
queue.add(treeNode1.right);
queue.add(treeNode2.right);
}
//如果左边的 左节点为空,右边的左节点不为空的话 那就赋值过去
if(treeNode1.left==null&&treeNode2.left!=null){
treeNode1.left=treeNode2.left;
}
//如果左边的 右节点为空 右边的右节点不为空的话 也赋值过去
if(treeNode1.right==null&&treeNode2.right!=null){
treeNode1.right=treeNode2.right;
}
}
return root1;
}
}