📜  门| GATE-CS-2015(套装3)|第 65 题(1)

📅  最后修改于: 2023-12-03 14:58:30.507000             🧑  作者: Mango

GATE CS 2015(套装3)- 第 65 题

该题考查了二叉搜索树的性质以及其中序遍历的应用。下面为该题的详细描述。

题目描述

给定一个大小为 $n$ 的有序整数数组 $A$,需要构建一个高度平衡的二叉搜索树(BST)以支持快速查找操作。假定 $n$ 是偶数,并且每个数组元素的值都不同。实现一个如下所示的函数:

def build_bst(A):
    """
    A: List[int] -- 有序数组
    return: TreeNode -- 构建好的二叉搜索树根节点
    """
    pass

函数返回构建好的二叉搜索树的根节点。你需要使用 $O(n)$ 的时间复杂度和恒定的空间复杂度实现该函数。

输入格式

输入共一行,为一个空格分隔的有序整数数组 $A$。其中 $2 \leq n \leq 10^3$,数组元素的值范围为 $1 \sim 10^4$。

输出格式

输出共一行,为二叉搜索树的中序遍历结果,节点之间以空格分隔。

样例输入
1 2 3 4 5 6 7 8
样例输出
1 2 3 4 5 6 7 8
说明

该输入对应的输出为高度平衡的二叉搜索树,中序遍历结果即为数组 $A$ 的所有元素。

解法思路
  1. 对于一个有序数组 $A$,二叉搜索树的根节点应当是数组的中间元素 $mid$。这一点可以通过找到数组的中位数来实现,中位数应该是$A[n/2-1]$。

    • 代码片段:
    mid = A[n // 2 - 1]
    root = TreeNode(mid)
    
  2. 左子树和右子树的生成也可以采用递归的方式来实现。为保证高度平衡,递归的处理方式应该是二分的。

    • 代码片段:
    # 左子树
    root.left = build_bst(A[:n // 2 - 1])
    # 右子树
    root.right = build_bst(A[n // 2:])
    
  3. 最后返回根节点即可。

实现代码

下面是完整的 Python 实现代码,其中注释部分是解释和代码片段。

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

def build_bst(A):
    """
    A: List[int] -- 有序数组
    return: TreeNode -- 构建好的二叉搜索树根节点
    """
    n = len(A)
    # 处理根节点
    mid = A[n // 2 - 1]
    root = TreeNode(mid)
    # 处理左子树
    if n > 2:
        root.left = build_bst(A[:n // 2 - 1])
    # 处理右子树
    if n > 1:
        root.right = build_bst(A[n // 2:])
    return root
总结

本题考查了二叉搜索树的性质以及其中序遍历的应用。具体来说,

  • 根据二叉搜索树的性质,构建二叉搜索树的根节点应当是数组的中间元素。
  • 由于一个有序数组构建出的二叉搜索树的高度应该是平衡的,因此左子树与右子树也应该分别构建高度平衡的二叉搜索树。
  • 递归地构建左右子树,重复上述步骤直至完成构建。

注意代码要特别注意边界处理,避免数组下标越界等情况的发生。