题目描述:给你两棵二叉树:root1 和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为null的节点将直接作为新二叉树的节点。返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
示例1:
1 | 输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7] |
示例2:1
2
3
输入:root1 = [1], root2 = [1,2]
输出:[2,2]
题解方法一: 深度优先搜索DFS
从根节点同时遍历两个二叉树,将对应的的节点进行合并
- 两个节点都为空: 新节点也为空
- 只有一个节点为空: 新节点等于不为空的节点
- 两个节点都不为空:新节点为两节点之和。
代码实现如下:1
2
3
4
5
6
7
8var mergeTrees = function(root1, root2) {
if (!root1) return root2
if (!root2) return root1
let merged = new TreeNode(root1.val + root2.val);
merged.left = mergeTrees(root1.left, root2.left);
merged.right = mergeTrees(root1.right, root2.right);
return merged
};
题解方法二:广度优先搜索BFS
首先判断两个二叉树是否为空
- 如果两个二叉树都为空: 合并后的二叉树也为空
- 如果只有一个二叉树为空: 则合并后的二叉树为另一个非空的二叉树
- 如果两个二叉树都不为空: 首先计算合并后的跟节点的值,从合并后的二叉树与两个原始的二叉树进行BFS,从根节点同时遍历每个二叉树,并将对应的节点进行合并。
使用三个队列分别存储合并后的节点、原始两个二叉树的节点
- 初始时:将每个二叉树的根节点分别加入相应的队列。
- 每次从每个队列中取出一个节点,判断两个原始二叉树的节点的左右子节点是否为空,
- 如果原始的两个二叉树左子节点都不为空:则合并后的二叉树为两个节点值之和,在创建合并后的二叉树的左子节点之后,将每个二叉树中的左子节点都加入相应的队列。(右子树同理)
- 如果原始的两个二叉树左子节点只有一个节点为空:则合并后的二叉树的左子树即为另一个原始二叉树的左子树,此时也不需要对非空左子树继续遍历,因此不需要将左子节点加入队列。(右子树同理)
代码实现如下: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
41var mergeTrees = function(root1, root2) {
if (!root1) return root2
if (!root2) return root1
let merged = new TreeNode(root1.val + root2.val);
let stack = [merged], stack1 = [root1], stack2 = [root2]
while(stack1.length > 0) {
let node = stack.shift()
let node1 = stack1.shift()
let node2 = stack2.shift()
let left1 = node1.left
let left2 = node2.left
let right1 = node1.right
let right2 = node2.right
if (left1 !== null|| left2!== null) {
if (!left1) {
node.left = left2
} else if (!left2) {
node.left = left1
} else {
node.left = new TreeNode(left1.val + left2.val);
stack.push(node.left)
stack1.push(left1)
stack2.push(left2)
}
}
if (right1!== null || right2!== null) {
if (!right1) {
node.right = right2
} else if (!right2) {
node.right = right1
} else {
node.right = new TreeNode(right1.val + right2.val);
stack.push(node.right)
stack1.push(right1)
stack2.push(right2)
}
}
}
return merged
};
总结:大功告成✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️