合并二叉树
题目描述
力扣链接🔗
代码分析
递归法
前序递归流程图:
此题可以构造一棵新的树来返回,但为了节约资源,可以使用树1进行修改即可。
确认返回值和参数
返回值为TreeNode,因为需要将二叉树和并,并返回其中的根节点,所以返回值需要为TreeNode,因为需要遍历2棵树,所以参数为2棵树,确认中止条件
当一棵树的左节点有值,而另一棵树的节点没有值,那么返回有值的那棵树的节点,不用再次递归。单层循环逻辑
单层循环中,两棵树都有值,那么需要将2棵树合并在一起。
代码:
三种递归都可以
/**
* 递归法(前序)
* @param root1
* @param root2
* @return
*/
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
// 为空直接返回一个节点即可,不用在递归
if (root1 == null) return root2;
if (root2 == null) return root1;
root1.val += root2.val; // 将root1作为结果,节约资源,中
root1.left = mergeTrees(root1.left, root2.left);
root1.right = mergeTrees(root1.right, root2.right);
return root1;
}
/**
* 递归法(中序)
*
* @param root1
* @param root2
* @return
*/
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
// 为空直接返回一个节点即可,不用在递归
if (root1 == null) return root2;
if (root2 == null) return root1;
root1.left = mergeTrees(root1.left, root2.left); // 左
root1.val += root2.val; // 将root1作为结果,节约资源,中
root1.right = mergeTrees(root1.right, root2.right); // 右
return root1;
}
/**
* 递归法(中序)
*
* @param root1
* @param root2
* @return
*/
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
// 为空直接返回一个节点即可,不用在递归
if (root1 == null) return root2;
if (root2 == null) return root1;
root1.left = mergeTrees(root1.left, root2.left); // 左
root1.right = mergeTrees(root1.right, root2.right); // 右
root1.val += root2.val; // 将root1作为结果,节约资源,中
return root1;
}
迭代法
使用层序遍历,同对称二叉树的迭代法思路大致一致,需要将2个节点入队进行判断。判断详情见注释。
/**
* 迭代法
*
* @param root1
* @param root2
* @return
*/
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
// 判断2棵树第一个元素
if (root1 == null) return root2;
if (root2 == null) return root1;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root1);
queue.offer(root2);
while (!queue.isEmpty()) {
TreeNode node1 = queue.poll();
TreeNode node2 = queue.poll();
node1.val += node2.val; // 此时2个节点一定不为null
// 如果2个节点的左节点都不为空,那么都加入节点
if (node1.left != null && node2.left != null) {
queue.offer(node1.left);
queue.offer(node2.left);
}
// 如果2个节点的右节点都不为空,那么都加入节点
if (node1.right != null && node2.right != null) {
queue.offer(node1.right);
queue.offer(node2.right);
}
// 当t1的左节点 为空 t2左节点不为空,就赋值过去
if (node1.left == null && node2.left != null) {
node1.left = node2.left; // 此时不再入队
}
// 当t1的右节点 为空 t2右节点不为空,就赋值过去
if (node1.right == null && node2.right != null) {
node1.right = node2.right;
}
// 如果左节点为空,右节点不为空的话,因为最后以root1作为返回结果,所以不需要在进行判断
}
return root1;
}