前言
合并二叉树,总体来说就是对树的遍历操作,可以是深度优先,也可以是广度优先。
昨晚熬夜到五点,肝不动,九点到实验室。世界对我好点。
题目
源码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
// 方法1 递归,深度
if (t1==null ){
return t2;
}
if( t2==null){
return t1;
}
// TreeNode merge=new TreeNode(t1.val+t2.val);
// merge.left=mergeTrees(t1.left,t2.left);
// merge.right=mergeTrees(t1.right,t2.right);
// return merge;
// 方法2,广度
if (t1==null ){
return t2;
}
if( t2==null){
return t1;
}
TreeNode merge=new TreeNode(t1.val+t2.val);
Queue<TreeNode> q=new LinkedList<>();
Queue<TreeNode>q_left=new LinkedList<>();
Queue<TreeNode>q_right=new LinkedList<>();
q.offer(merge);
q_left.offer(t1);
q_right.offer(t2);
while(!q_left.isEmpty() && !q_right.isEmpty()){
TreeNode node=q.poll(),node1=q_left.poll(),node2=q_right.poll();
TreeNode left=node1.left,right=node1.right,left1=node2.left,right1=node2.right;
if(left!=null || left1!=null){
if(left!=null && left1!=null){//当两个二叉树的左子树同时不为空时
node.left=new TreeNode(left.val+left1.val);//得到节点为相加
q.offer(node.left);//入队列
q_left.offer(left);
q_right.offer(left1);
}else if(left!=null){//当任意一方的左子树为空,不需要继续遍历左子树,所以不入队列
node.left=left;
}else{
node.left=left1;
}
}
if(right!=null || right1!=null){
if(right !=null && right1!=null){//右子树同左子树
node.right=new TreeNode(right.val+right1.val);
q.offer(node.right);
q_left.offer(right);
q_right.offer(right1);
}else if(right!=null){
node.right=right;
}else{
node.right=right1;
}
}
}
return merge;
}
}