返回

从头理解合并二叉树,从此算法难题不再难!

见解分享

前言

算法在计算机科学中占据着举足轻重的地位,是解决复杂问题和优化程序性能的关键。LeetCode每日一题栏目为您精选最具代表性的算法题,带领您逐题攻破,不断提升您的算法技能。今天,我们就来共同挑战LeetCode第617题——合并二叉树。

题目

给定两棵二叉树 root1root2 ,请将它们合并成一棵新的二叉树。合并后的树的根节点为 root1 的根节点,且在 root1 上的每个节点都有一个与在 root2 上的相同节点合并而成的对应节点。此外,合并后的树中每个节点的左子树对应 root1 中对应节点的左子树,右子树对应 root2 中对应节点的右子树。

示例 1:

示例 1

输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]

示例 2:

示例 2

输入:root1 = [1], root2 = [1,2]
输出:[2,2]

思考过程

合并二叉树的本质是将两棵树的节点一一对应地合并,并保持树的结构不变。因此,我们可以采用递归的方式来解决这个问题。具体而言,我们可以遵循以下步骤:

  1. 如果 root1root2 都为 null,则返回 null
  2. 如果 root1null,则返回 root2
  3. 如果 root2null,则返回 root1
  4. root1root2 的值相加,并将其作为合并后的树的根节点。
  5. root1 的左子树与 root2 的左子树合并,并将其作为合并后的树的左子树。
  6. root1 的右子树与 root2 的右子树合并,并将其作为合并后的树的右子树。

通过以上步骤,我们就可以将两棵二叉树合并成一棵新的二叉树。

实现方法

以下是合并二叉树的实现方法:

def mergeTrees(root1, root2):
    if not root1 and not root2:
        return None
    if not root1:
        return root2
    if not root2:
        return root1

    root = TreeNode(root1.val + root2.val)
    root.left = mergeTrees(root1.left, root2.left)
    root.right = mergeTrees(root1.right, root2.right)

    return root

时间复杂度

合并二叉树的时间复杂度为 O(m + n),其中 mn 分别为 root1root2 的节点数。

空间复杂度

合并二叉树的空间复杂度为 O(m + n),其中 mn 分别为 root1root2 的节点数。

结语

通过本指南,您已经掌握了合并二叉树的思想和实现方法,并对递归算法有了更深入的理解。今后,您在面对类似的算法问题时,能够更加从容地应对。算法学习是一个循序渐进的过程,需要不断地练习和总结。希望您能够继续挑战自我,不断提升自己的算法技能。