返回

探索 LeetCode617 题:巧妙合并二叉树,从入门到精通

前端

1. 理解问题

LeetCode 617 题「合并二叉树」给出了两个二叉树 root1root2,要求我们将它们合并成一棵新的二叉树。合并的规则是:

  • 如果两个节点重叠,那么将他们的值相加作为节点合并后的新值。
  • 如果两个节点中有一个为 null,那么另一个节点将直接作为新二叉树的节点。

合并后的二叉树需要满足所有二叉树的性质,包括:

  • 每个节点至多有两个子节点。
  • 左子树的所有值都小于父节点的值。
  • 右子树的所有值都大于父节点的值。

2. 设计算法

LeetCode 617 题「合并二叉树」可以采用递归或迭代的方式解决。这里我们介绍递归解法:

  1. 首先,需要判断两个节点是否都为 null。如果是,则返回 null,表示合并后的二叉树为空。
  2. 如果其中一个节点为 null,则另一个节点将直接作为合并后的二叉树的根节点。
  3. 如果两个节点都不为 null,则将两个节点的值相加,作为合并后的二叉树的根节点的值。
  4. 递归地将两个节点的左子树和右子树分别合并,并将其作为合并后的二叉树的左子树和右子树。

3. 实现代码

根据上述算法,我们可以实现以下代码:

def mergeTrees(root1, root2):
  """
  合并两棵二叉树。

  :param root1: 第一棵二叉树的根节点。
  :param root2: 第二棵二叉树的根节点。
  :return: 合并后的二叉树的根节点。
  """

  # 如果两个节点都为 null,则返回 null。
  if root1 is None and root2 is None:
    return None

  # 如果其中一个节点为 null,则另一个节点将直接作为合并后的二叉树的根节点。
  if root1 is None:
    return root2
  if root2 is None:
    return root1

  # 将两个节点的值相加,作为合并后的二叉树的根节点的值。
  root = TreeNode(root1.val + root2.val)

  # 递归地将两个节点的左子树和右子树分别合并,并将其作为合并后的二叉树的左子树和右子树。
  root.left = mergeTrees(root1.left, root2.left)
  root.right = mergeTrees(root1.right, root2.right)

  return root

4. 总结

LeetCode 617 题「合并二叉树」是一道经典的算法和数据结构问题,它考察了如何将两棵二叉树合并成一棵新的二叉树的能力。这道题需要我们理解二叉树的基本概念和操作,以及掌握递归或迭代的算法技巧。通过本文的介绍,相信你已经对这道题的解法有了更深入的理解。如果你有兴趣,可以尝试自己实现一下代码,加深对算法的理解。