1. 递归法
/*
时间O(n) 递归的次数/递归的深度
空间O(n) 递归栈用的空间
思路:
0 假设利用root1作为合并的节点。
1 每次递归时,两棵树 同一个位置,如果不为空,值就要相加。
2 如果有一个为空,值就是不为空的 那个节点。如果都为空,就是null
*/
var mergeTrees = function (root1, root2) {
// 1 如果有一方位空 就返回另外一个节点的值 另外一个节点如果也没空 正好了 返回null
if (root1 === null) return root2
if (root2 === null) return root1
// 2 单层递归的逻辑 同一个位置 值相加
root1.val += root2.val
// 3 左节点的值 等于两棵树的节点值的相加的和
root1.left = mergeTrees(root1.left, root2.left)
root1.right = mergeTrees(root1.right, root2.right)
return root1
};
console.log(mergeTrees(a, aa));
2. 迭代法
/*
时间O(n) n是节点的个数,while循环的次数
空间O(n) n是队列数组占用的空间
思路:利用迭代,两棵树的目标节点 放进queue,取出判断,值相加 + 判断左右节点是否为null
如果左节点和右节点都不为null 就直接放入queue 下次判断
如果左节点为null 右节点不为null 就直接赋值
如果左节点和右节点都为null 就不管了
*/
var mergeTrees = function (root1, root2) {
// 1. 判空 【想不到的点】
if (root1 === null) return root2
if (root2 === null) return root1
// 2. 创建队列 队列初始化【一个队列就够了】
let queue = []
queue.push(root1)
queue.push(root2)
// 3. while循环
// 【每次while循环 能够搞定当前的节点 以及下面的左右节点
// 1 node1和node2 都不为null 就push 进入queue下次while循环搞定
// 2 node1为null node2不为null 就直接赋值
// 3 都是null就不用管了】
while (queue.length > 0) {
// 4. while循环里面刚进去的 一定都是不为空的 root1.val += 若roo2.val
let node1 = queue.shift()
let node2 = queue.shift()
node1.val += node2.val
// 5. 如果node1的左节点和node2的左节点都不为空 就加入队列
if (node1.left !== null && node2.left !== null) {
queue.push(node1.left)
queue.push(node2.left)
}
// 6. 如果node1的右节点和node2的右节点都不为空 就加入队列
if (node1.right !== null && node2.right !== null) {
queue.push(node1.right)
queue.push(node2.right)
}
// 7. 如果node1的左节点为空 但是node2的左节点不为空 直接赋值
if (node1.left === null && node2.left !== null) {
node1.left = node2.left
}
// 8. 如果node1的右节点为空 但是node2的右节点不为空 直接赋值
if (node1.right === null && node2.right !== null) {
node1.right = node2.right
}
}
// 9. 返回root1节点
return root1
};
console.log(mergeTrees(a, aa));