返回

你一定不知道!如何用BST中序遍历轻松玩转二叉搜索树

后端

二叉搜索树:基础知识与 LeetCode 应用

二叉搜索树简介

二叉搜索树 (BST)是一种特殊的二叉树,它以特定方式组织数据,使得查找和检索元素非常高效。BST 中的每个结点都包含一个值,并且具有以下性质:

  • 每个结点最多有两个子结点:左子结点和右子结点。
  • 左子结点的值小于或等于父结点的值。
  • 右子结点的值大于或等于父结点的值。

二叉搜索树的中序遍历

中序遍历 是一种遍历二叉搜索树的算法,它遵循以下顺序:

  1. 先遍历左子树。
  2. 再遍历根结点。
  3. 最后遍历右子树。

中序遍历的特殊之处在于,它保证了以升序遍历 BST 中的所有结点。

LeetCode 1038:从二叉搜索树到更大和树

题目:

给定一棵二叉搜索树(BST),将每个结点的值替换成从根结点到该结点的路径上所有结点值的和。

示例:

  • 输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
  • 输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

思路与算法

解决这道题的关键是利用 BST 中序遍历的特性。我们可以从根结点开始,依次遍历 BST 中的所有结点。在遍历每个结点时,我们将该结点值与之前遍历过的所有结点值相加,并将其存储在该结点中。这样,当我们遍历完 BST 的所有结点时,每个结点中存储的值就是从根结点到该结点路径上的所有结点值的和。

代码示例:

def bst_to_greater_tree(root):
    # 定义一个全局变量 sum 来存储从根结点到当前结点的路径上所有结点值的和
    global sum
    sum = 0

    # 对 BST 进行中序遍历
    def inorder(root):
        # 如果根结点为空,直接返回
        if not root:
            return

        # 递归遍历左子树
        inorder(root.left)

        # 将当前结点值加上 sum 的值,得到新的 sum 值
        sum += root.val
        root.val = sum

        # 递归遍历右子树
        inorder(root.right)

    inorder(root)

    return root

总结

通过探索二叉搜索树的中序遍历,我们成功解决了 LeetCode 上的 1038. 从二叉搜索树到更大和树这一道题目。这道题展示了 BST 中序遍历的实用性,为解决各种算法问题提供了宝贵的工具。

常见问题解答

1. 为什么中序遍历对 BST 如此重要?

中序遍历以升序遍历 BST 中的所有结点,这对于某些算法操作(例如查找或查找最近元素)至关重要。

2. 如何高效地更新 BST 中结点值?

使用全局变量 sum 来跟踪从根结点到当前结点的路径上所有结点值的和。在中序遍历时,将 sum 更新为新值,并将其分配给当前结点值。

3. BST 中序遍历的复杂度是多少?

O(n),其中 n 是 BST 中的结点数。

4. 中序遍历是否适用于非二叉搜索树?

否,中序遍历仅适用于 BST,因为其依赖于左子结点值小于父结点值,右子结点值大于或等于父结点值的特性。

5. 二叉搜索树还有哪些其他应用?

BST 还有许多其他应用,包括:
- 查找和检索元素
- 范围查询
- 排序
- 集合运算