📜  门| GATE CS 2018 |简体中文问题10(1)

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

门 | GATE CS 2018 | 简体中文问题10

问题描述

给定一颗二叉搜索树(BST)和一个数字n,找出二叉搜索树中第n个最小节点。例如,在下图的BST中,第3个最小节点是10。如果n大于树的节点数,则返回-1。

bst

解题思路
方法1:中序遍历

由于这是一颗BST,因此中序遍历树可以得到排序的元素序列。由于我们需要找到第n个最小节点,因此可以在中序遍历中进行计数器计数,找到第n个节点并返回其值。

实现该方法需要迭代或使用递归来遍历树节点。我们需要一个计数器和一个变量来存储结点值。然后我们可以将计数器与n比较,如果相等则返回变量值。

方法2:利用BST的性质

二叉搜索树具有一个重要特性:对于任意节点x,左子树中所有节点的值都小于x,而右子树中所有节点的值都大于x。

因此,如果我们能求出每个节点在树中排名的位置,我们便能够找到第n小的节点。对于任意节点x,其排名位置为x的左子树大小加上1,再加上x在右子树中的排名位置。

具体实现方法为:首先计算左子树大小,并将其与n比较。如果左子树大小等于n-1,则返回x。如果左子树大小小于n-1,则在右子树中继续递归搜索。否则,在左子树中继续递归搜索。

代码实现
方法1:中序遍历
class Solution:
    def __init__(self):
        self.count = 0
        self.val = 0
        
    def kthSmallest(self, root: TreeNode, k: int) -> int:
        self.inorder(root, k)
        return self.val
        
    def inorder(self, root, k):
        if not root:
            return
        self.inorder(root.left, k)
        self.count += 1
        if self.count == k:
            self.val = root.val
        self.inorder(root.right, k)
方法2:利用BST的性质
class Solution:
    def __init__(self):
        self.result = -1
        
    def kthSmallest(self, root: TreeNode, k: int) -> int:
        self.helper(root, k)
        return self.result
        
    def helper(self, root, k):
        if not root:
            return 0
        left_size = self.helper(root.left, k)
        if left_size == k - 1:
            self.result = root.val
        right_size = self.helper(root.right, k - left_size - 1)
        return 1 + left_size + right_size
复杂度分析
方法1:中序遍历

时间复杂度:O(n),其中n为二叉树的节点数目。最坏情况下需要整棵树遍历一遍。

空间复杂度:O(n),需要递归处理所有的节点。

方法2:利用BST的性质

时间复杂度:O(logn),其中n为二叉树的节点数目。在最坏情况下需要遍历整棵树。

空间复杂度:O(1),空间复杂度并不取决于树的大小,而是取决于递归栈的深度。在本问题中,递归栈的最大深度等于树的高度,因此空间复杂度为O(logn)。