给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
解答
最简单也是最直接的,利用BFS递归实现
class Solution { public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { if(t1 == null && t2 == null) { return null; } TreeNode treeNode = new TreeNode(); if(t1 != null && t2 != null) { treeNode.val = t1.val + t2.val; treeNode.left = mergeTrees(t1.left, t2.left); treeNode.right = mergeTrees(t1.right, t2.right); } if(t1 != null && t2 == null) { treeNode.val = t1.val; treeNode.left = mergeTrees(t1.left, null); treeNode.right = mergeTrees(t1.right, null); } if(t1 == null && t2 != null) { treeNode.val = t2.val; treeNode.left = mergeTrees(null, t2.left); treeNode.right = mergeTrees(null, t2.right); } return treeNode; } }
官方简答
核心关键
如果两棵树的当前节点均不为空,我们就将它们的值进行相加,并对它们的左孩子和右孩子进行递归合并;如果其中有一棵树为空,那么我们返回另一颗树作为结果;
public class Solution { public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { if (t1 == null) return t2; if (t2 == null) return t1; t1.val += t2.val; t1.left = mergeTrees(t1.left, t2.left); t1.right = mergeTrees(t1.right, t2.right); return t1; } }
进阶
利用迭代实现
class Solution { public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { // 如果左树为空,直接返回右树 if(t1 == null) { return t2; } Stack<TreeNode[]> stack = new Stack(); stack.push(new TreeNode[]{t1,t2}); while(stack.size() > 0) { TreeNode[] treeNodes = stack.pop(); TreeNode tmpt1 = treeNodes[0]; TreeNode tmpt2 = treeNodes[1]; // 如果左数或右数为空,不需要合并,直接走下一个 if(tmpt1 == null || tmpt2 == null) { continue; } // 合并 tmpt1.val += tmpt2.val; // 如果左树的左分支为空,则返回右树的左分支 if(tmpt1.left == null) { tmpt1.left = tmpt2.left; } else { // 否则将左树左分支和右树左分支加入处理 stack.push(new TreeNode[]{tmpt1.left,tmpt2.left}); } // 如果左树的右分支为空,则返回右树的右分支 if(tmpt1.right == null) { tmpt1.right = tmpt2.right; } else { // 否则将左树右分支和右树右分支加入处理 stack.push(new TreeNode[]{tmpt1.right,tmpt2.right}); } } // 返回合并后的树 return t1; } }