📌  相关文章
📜  教资会网络 | UGC-NET CS 2017 年 12 月 2 日 |问题 4(1)

📅  最后修改于: 2023-12-03 15:10:16.702000             🧑  作者: Mango

教资会网络 | UGC-NET CS 2017 年 12 月 2 日 |问题 4

概述

本题是关于基本的数据结构和算法的题目,要求考生实现一个根据二叉搜索树的先序遍历序列构建二叉搜索树的函数。这是一道较为典型的树的问题,考生需要熟练掌握二叉树的遍历、构建等基本操作。

题目描述

给定一组二叉搜索树的先序遍历序列,编写一个算法构建该二叉搜索树。假设树中不存在重复元素。例如,如果给定序列 {10,5,1,7,40,50},则构建出来的搜索树如下图所示:

        10
      /   \
     5     40
   /  \      \
  1    7      50
实现方法
分析

构建二叉搜索树的基本思路是:先确定根节点,然后递归构建左子树和右子数。根据节点之间的大小关系,可以确定左子树的所有节点都比右子树的节点小。

本题先序遍历序列的第一个值是根节点,可以将这个值插入到一个空树中,然后将剩下的点拆分成左右两个子序列,分别递归构建左右子树。

代码
class TreeNode(object):
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

def bstFromPreorder(preorder):
    if len(preorder) == 0:
        return None
    root = TreeNode(preorder[0])
    left_seq = [x for x in preorder if x < root.val]
    right_seq = [x for x in preorder if x > root.val]
    root.left = bstFromPreorder(left_seq)
    root.right = bstFromPreorder(right_seq)
    return root
复杂度分析
  • 时间复杂度:O(n^2),其中n是二叉搜索树中的节点数。对于每个节点,构建树需要O(n)的时间,在遍历整个序列时,需要O(n)的时间,所以总时间复杂度是O(n^2)。
  • 空间复杂度:O(n),其中n是二叉搜索树中的节点数。递归栈的空间是O(log n),最坏情况下会达到O(n)。