一.递归法
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param t1 TreeNode类
* @param t2 TreeNode类
* @return TreeNode类
*/
public TreeNode mergeTrees (TreeNode t1, TreeNode t2) {
// write code here
if (t1 == null) {
return t2;
}
if (t2 == null) {
return t1;
}
if (t1 == null && t2 == null) {
return null;
}
//前面的if语句不走,到这里说明t1不为空,t2也不为空
TreeNode treeNode = new TreeNode(t1.val + t2.val);
//左子树递归进入,创建一个结点,值就是t1加t2
treeNode.left = mergeTrees(t1.left,t2.left);
//右子树递归进入,创建一个结点,值就是t1加t2
treeNode.right = mergeTrees(t1.right,t2.right);
return treeNode;
}
}
二.非递归法
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param t1 TreeNode类
* @param t2 TreeNode类
* @return TreeNode类
*/
public TreeNode mergeTrees (TreeNode t1, TreeNode t2) {
// write code here
//如果t1树为空,返回t2
if (t1 == null) {
return t2;
}
//如果t2为空,返回t1
if (t2 == null) {
return t1;
}
//如果两个树都为空,返回null值
if (t1 == null && t2 == null) {
return null;
}
/*
前面的if语句不走,到这里说明t1不为空,t2也不为空,
创建head根结点保存两个树根结点的值
*/
TreeNode head = new TreeNode(t1.val + t2.val);
/**
* q队列为结点合并
* q1为遍历t1树
* q2为遍历t2树
*/
Queue<TreeNode> q = new LinkedList<>();
Queue<TreeNode> q1 = new LinkedList<>();
Queue<TreeNode> q2 = new LinkedList<>();
q.offer(head);
q1.offer(t1);
q2.offer(t2);
//队列不为空,说明还没有合并完
while (!q1.isEmpty() && !q2.isEmpty()) {
/*
依次将队列中的值弹出
*/
TreeNode node = q.poll();
TreeNode node1 = q1.poll();
TreeNode node2 = q2.poll();
//标记左子树的左右结点,标记右子树的左右结点
TreeNode node1Left = node1.left;
TreeNode node2Left = node2.left;
TreeNode node1Right = node1.right;
TreeNode node2Right = node2.right;
//只要有一个不为空就进入if语句,否则队列无元素
if (node1Left != null || node2Left != null) {
//t1树跟t2都有左子树,合并后返回一个新结点,让node.left结点连接
if (node1Left != null && node2Left != null) {
TreeNode left = new TreeNode(node1Left.val + node2Left.val);
node.left = left;
q.offer(left);
q1.offer(node1Left);
q2.offer(node2Left);
}
/*
可能t2没有左子树,那么让t1的元素跟node.left连接
*/
else if (node1Left != null) {
node.left = node1Left;
}
//说明t1可能没有左子树,让t2的元素跟node.left连接
else {
node.left = node2Left;
}
}
if (node1Right != null || node2Right != null) {
if (node1Right != null && node2Right != null) {
TreeNode right = new TreeNode(node1Right.val + node2Right.val);
node.right = right;
q.offer(right);
q1.offer(node1Right);
q2.offer(node2Right);
}else if (node1Right != null) {
node.right = node1Right;
}else {
node.right = node2Right;
}
}
}
//最后返回头结点head
return head;
}
}