leetCode–617(合并二叉树)
给你两棵二叉树: root1 和 root2 。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
示例1:
1 2
| 输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7] 输出:[3,4,5,5,4,null,7]
|
示例 2:
1 2
| 输入:root1 = , root2 = 输出:
|
解法一:递归
先判断两个树是否为空,如果不为空将,两棵树的根节点相加,再递归遍历两个数的左子树和右子树。
代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
class Solution { public TreeNode mergeTrees(TreeNode root1, TreeNode root2) { if (root1==null && root2==null) return null; if (root1==null || root2==null) return root1==null?root2:root1; root1.val = root1.val+root2.val; root1.left = mergeTrees(root1.left,root2.left); root1.right = mergeTrees(root1.right,root2.right); return root1; } }
|
解法二:迭代
使用一个队列,只要两个树的左节点不为空,就将节点放入队列中,同理右子树也一样,只要右子树节点不为空,就将右子树加入到队列中,。
同时再定义一个合并后的队列,存放合并后的树。
代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
class Solution { public TreeNode mergeTrees(TreeNode root1, TreeNode root2) { if (root1==null) return root2; if (root2==null) return root1; Deque<TreeNode> merDeque = new ArrayDeque<>(); Deque<TreeNode> deque = new ArrayDeque<>(); TreeNode mer= new TreeNode(root1.val+root2.val); merDeque.addLast(mer); deque.addLast(root1); deque.addLast(root2); while (!merDeque.isEmpty() && !deque.isEmpty()){ TreeNode node = merDeque.pop(); TreeNode node1 = deque.pop(); TreeNode node2 = deque.pop(); if (node1.left!=null || node2.left!=null){ if (node1.left!=null && node2.left!=null){ TreeNode leftNode = new TreeNode(node1.left.val + node2.left.val); node.left = leftNode; merDeque.addLast(leftNode); deque.addLast(node1.left); deque.addLast(node2.left); } else if (node1.left==null){ node.left = node2.left; } else if(node2.left==null){ node.left = node1.left; } } if (node1.right!=null || node2.right!=null){ if (node1.right!=null && node2.right!=null){ TreeNode rightNode = new TreeNode(node1.right.val + node2.right.val); node.right = rightNode; merDeque.addLast(rightNode); deque.addLast(node1.right); deque.addLast(node2.right); } else if (node1.right==null){ node.right = node2.right; } else if (node2.right==null) { node.right = node1.right; } } } return mer; } }
|