原题链接:
https://leetcode.cn/problems/merge-two-binary-trees/
这是一道关于二叉树的题目,要求我们合并两棵二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null
的节点将直接作为新二叉树的节点。
思路分析:
我们可以使用递归的方法来解决这个问题。具体步骤如下:
基本情况:如果
root1
或root2
中的任何一个为null
,则返回非空的那个节点。这是因为,如果其中一个节点为null
,那么合并的结果就是另一个节点。递归情况:如果
root1
和root2
都不为null
,我们可以创建一个新的节点,其值为root1.val + root2.val
。递归合并
root1
和root2
的左子树,并将结果设置为新节点的左子树。递归合并
root1
和root2
的右子树,并将结果设置为新节点的右子树。返回新节点。
代码实现:
function TreeNode(val, left, right) {
this.val = (val===undefined ? 0 : val);
this.left = (left===undefined ? null : left);
this.right = (right===undefined ? null : right);
}
var mergeTrees = function(root1, root2) {
// 基本情况
if (root1 === null) return root2;
if (root2 === null) return root1;
// 创建新节点
let newNode = new TreeNode(root1.val + root2.val);
// 递归合并左子树和右子树
newNode.left = mergeTrees(root1.left, root2.left);
newNode.right = mergeTrees(root1.right, root2.right);
return newNode;
};
这种递归方法的时间复杂度是 O(min(m, n))
,其中 m
和 n
分别是两棵树的节点数。因为我们只访问了两棵树中都存在的节点。空间复杂度取决于递归的深度,最坏情况下,递归的深度等于较小的树的高度,所以空间复杂度是 O(min(height1, height2))
。