返回

无需排序也能还原,是靠了这些套路!

闲谈

二叉搜索树(Binary Search Tree,简称BST)是一种特殊的二叉树,它具有以下特点:

  • 节点的左子树中的所有节点的值都小于或等于该节点的值。
  • 节点的右子树中的所有节点的值都大于或等于该节点的值。

因此,二叉搜索树具有快速查找的特性,可以快速找到特定值对应的节点。

我们今天要解决的问题是 leetcode 1008,给定一个前序遍历数组,要求返回与该前序遍历匹配的二叉搜索树的根节点。

对于这个问题,我们可以利用二叉搜索树的特点来解决。

  1. 寻找根节点

首先,我们需要找到二叉搜索树的根节点。根节点是整个二叉搜索树中最大的节点,它位于最上层。因此,我们可以直接取前序遍历数组中的第一个元素作为根节点。

  1. 递归构建子树

找到根节点后,我们需要递归地构建它的左子树和右子树。

  • 左子树:左子树中的所有节点的值都小于或等于根节点的值。因此,我们可以从前序遍历数组中找到第一个大于根节点的值,将它作为左子树的根节点。然后,我们递归地构建左子树的左子树和右子树。
  • 右子树:右子树中的所有节点的值都大于或等于根节点的值。因此,我们可以从前序遍历数组中找到第一个大于根节点的值,将它作为右子树的根节点。然后,我们递归地构建右子树的左子树和右子树。
  1. 返回根节点

最后,我们将返回根节点作为结果。

下面是 leetcode 1008 的 Python 实现:

def bst_from_preorder(preorder):
  """
  从前序遍历数组构建二叉搜索树。

  参数:
    preorder:前序遍历数组。

  返回:
    二叉搜索树的根节点。
  """

  # 如果前序遍历数组为空,则返回 None。
  if not preorder:
    return None

  # 找到根节点。
  root = preorder[0]

  # 从前序遍历数组中找到第一个大于根节点的值。
  i = 1
  while i < len(preorder) and preorder[i] < root:
    i += 1

  # 构建左子树和右子树。
  left_preorder = preorder[1:i]
  right_preorder = preorder[i:]
  left_root = bst_from_preorder(left_preorder)
  right_root = bst_from_preorder(right_preorder)

  # 返回根节点。
  return TreeNode(root, left_root, right_root)


class TreeNode:
  """
  二叉树节点。
  """

  def __init__(self, val, left=None, right=None):
    self.val = val
    self.left = left
    self.right = right

我们还可以使用更简洁的代码来实现:

def bst_from_preorder(preorder):
  """
  从前序遍历数组构建二叉搜索树。

  参数:
    preorder:前序遍历数组。

  返回:
    二叉搜索树的根节点。
  """

  # 如果前序遍历数组为空,则返回 None。
  if not preorder:
    return None

  # 找到根节点。
  root = preorder[0]

  # 找到第一个大于根节点的值。
  i = next((i for i in range(1, len(preorder)) if preorder[i] > root), len(preorder))

  # 构建左子树和右子树。
  left_preorder = preorder[1:i]
  right_preorder = preorder[i:]
  return TreeNode(root, bst_from_preorder(left_preorder), bst_from_preorder(right_preorder))


class TreeNode:
  """
  二叉树节点。
  """

  def __init__(self, val, left=None, right=None):
    self.val = val
    self.left = left
    self.right = right

希望这篇文章能帮助你理解如何利用前序遍历来构建二叉搜索树。