📅  最后修改于: 2023-12-03 14:58:20.112000             🧑  作者: Mango
给定一颗二叉搜索树(BST)和一个数字n,找出二叉搜索树中第n个最小节点。例如,在下图的BST中,第3个最小节点是10。如果n大于树的节点数,则返回-1。
由于这是一颗BST,因此中序遍历树可以得到排序的元素序列。由于我们需要找到第n个最小节点,因此可以在中序遍历中进行计数器计数,找到第n个节点并返回其值。
实现该方法需要迭代或使用递归来遍历树节点。我们需要一个计数器和一个变量来存储结点值。然后我们可以将计数器与n比较,如果相等则返回变量值。
二叉搜索树具有一个重要特性:对于任意节点x,左子树中所有节点的值都小于x,而右子树中所有节点的值都大于x。
因此,如果我们能求出每个节点在树中排名的位置,我们便能够找到第n小的节点。对于任意节点x,其排名位置为x的左子树大小加上1,再加上x在右子树中的排名位置。
具体实现方法为:首先计算左子树大小,并将其与n比较。如果左子树大小等于n-1,则返回x。如果左子树大小小于n-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)
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
时间复杂度:O(n),其中n为二叉树的节点数目。最坏情况下需要整棵树遍历一遍。
空间复杂度:O(n),需要递归处理所有的节点。
时间复杂度:O(logn),其中n为二叉树的节点数目。在最坏情况下需要遍历整棵树。
空间复杂度:O(1),空间复杂度并不取决于树的大小,而是取决于递归栈的深度。在本问题中,递归栈的最大深度等于树的高度,因此空间复杂度为O(logn)。