简述如何实现二叉搜索树的第 k k 个节点(从小到大) ?
参考答案:
要实现二叉搜索树的第k个节点(从小到大),我们可以使用中序遍历(In-Order Traversal)的方法。在二叉搜索树中,中序遍历的结果是一个升序的节点值序列。因此,我们可以利用中序遍历的特性来找到第k个节点。
下面是一个基于递归的Python实现:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def kthSmallest(root: TreeNode, k: int) -> TreeNode:
def inorder_traversal(node, k, count):
nonlocal result
if not node:
return
# 先遍历左子树
if node.left:
inorder_traversal(node.left, k, count)
# 计数器加1,检查是否找到了第k个节点
count += 1
if count == k:
result = node
return
# 如果没有找到,继续遍历右子树
if node.right:
inorder_traversal(node.right, k, count)
# 初始化结果变量
result = None
# 从根节点开始中序遍历
inorder_traversal(root, k, 0)
return result
在这个实现中,我们首先定义了一个内部函数inorder_traversal
,用于执行中序遍历。这个函数接收三个参数:当前节点node
、要查找的节点序号k
和计数器count
。在函数内部,我们首先检查当前节点是否为空,如果为空则直接返回。然后,我们递归地遍历左子树,接着将计数器加1并检查是否达到了第k个节点。如果是,则将当前节点存储在result
变量中并返回。最后,如果还没有找到第k个节点,我们递归地遍历右子树。
在主函数kthSmallest
中,我们初始化结果变量result
为None
,并从根节点开始调用inorder_traversal
函数进行中序遍历。最后,我们返回result
,即第k个节点。
这个算法的时间复杂度是O(k),因为我们只需要遍历到第k个节点即可。空间复杂度是O(h),其中h是树的高度。在最坏情况下,当树退化为链表时,空间复杂度为O(n),其中n是节点的数量。