合并二叉树
题目描述
力扣链接🔗

代码分析
递归法
前序递归流程图:

此题可以构造一棵新的树来返回,但为了节约资源,可以使用树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;}
