一:题意分析
本题主要是一起操作两个二叉树 其实和之前写过的那个对称二叉树差不多,只不过对称二叉树是操作根节点的左右子树 也是操作两颗树 而这道题就很直接指出来操作的是 两颗独立的二叉树 遍历的时候 是两颗树一起遍历的
刚开始会有点懵 但是仔细想想 不还就是递归嘛 确定递归的三要素即可。这里介绍两种方法(递归法和迭代法)
二:递归解法
var mergeTrees = function(root1, root2) {
// 确定递归的终止条件
if(root1.value === null)return root2;
if(root2.value === null)return root1;
root1.value += root2.value; // 中
//递归的单层逻辑
root1.left = mergeTrees(root1.left,root2.left); // 左
root1.right = mergeTrees(root1.right,root2.right); // 右
return root1;
};
递归总结:这道题其实不管前序遍历 中序遍历还是后序遍历都是可以的,只不过前序遍历会更加符合我们处理这颗二叉树的正常逻辑。
三:迭代法
// 迭代法
var mergeTrees = function(root1, root2){
//判断终止条件
if(root1 === null)return root2;
if(root2 === null)return root1;
let queue = [] // 定义一个队列 用来存放二叉树每一层的节点
queue.push(root1);
queue.push(root2);
while(queue.length){
let node1 = queue.shift();
let node2 = queue.shift();
node1.val += node2.val; // 把每一层对应位置的值想加。
// 判断特殊情况
if(node1.left !== null && node2.left !== null){
// 说明两棵树对应的节点的左子树都有值
queue.push(node1.left);
queue.push(node2.left);
}
if(node1.right !== null && node2.right !== null){
// 说明两棵树对应的节点的左子树都有值
queue.push(node1.right);
queue.push(node2.right);
}
if(node1.left === null && node2.left !== null){
// 如果第一棵树的左子树没有值的话 那么就把第二棵树的左子树赋值给第一棵树的左子树
node1.left = node2.left
}
if(node1.right === null && node2.right !== null){
// 同理
node1.right = node2.right
}
}
return root1;
}