返回
无需排序也能还原,是靠了这些套路!
闲谈
2023-10-07 07:35:01
二叉搜索树(Binary Search Tree,简称BST)是一种特殊的二叉树,它具有以下特点:
- 节点的左子树中的所有节点的值都小于或等于该节点的值。
- 节点的右子树中的所有节点的值都大于或等于该节点的值。
因此,二叉搜索树具有快速查找的特性,可以快速找到特定值对应的节点。
我们今天要解决的问题是 leetcode 1008,给定一个前序遍历数组,要求返回与该前序遍历匹配的二叉搜索树的根节点。
对于这个问题,我们可以利用二叉搜索树的特点来解决。
- 寻找根节点
首先,我们需要找到二叉搜索树的根节点。根节点是整个二叉搜索树中最大的节点,它位于最上层。因此,我们可以直接取前序遍历数组中的第一个元素作为根节点。
- 递归构建子树
找到根节点后,我们需要递归地构建它的左子树和右子树。
- 左子树:左子树中的所有节点的值都小于或等于根节点的值。因此,我们可以从前序遍历数组中找到第一个大于根节点的值,将它作为左子树的根节点。然后,我们递归地构建左子树的左子树和右子树。
- 右子树:右子树中的所有节点的值都大于或等于根节点的值。因此,我们可以从前序遍历数组中找到第一个大于根节点的值,将它作为右子树的根节点。然后,我们递归地构建右子树的左子树和右子树。
- 返回根节点
最后,我们将返回根节点作为结果。
下面是 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
希望这篇文章能帮助你理解如何利用前序遍历来构建二叉搜索树。