这个题解使用了迭代的方式进行中序遍历二叉搜索树。中序遍历二叉搜索树可以得到一个升序排列的序列,因此第k小的元素就是中序遍历序列中的第k个元素。具体做法是:用一个栈来模拟递归的过程,首先不断地将根节点的左子树压入栈中,直到左子树为空;然后弹出栈顶元素并将k减1,如果此时k等于0,说明已经找到了第k小的元素,直接返回该元素的值;否则继续遍历该元素的右子树。重复这个过程直到找到第k小的元素或遍历完整棵树。
时间复杂度: O(h+k),其中h为树的高度
空间复杂度: O(h),其中h为树的高度
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
stack = []
while root is not None or len(stack) > 0:
# 不断地将根节点的左子树压入栈中,直到左子树为空
if root is None:
# 弹出栈顶元素
root = stack.pop()
k -= 1
# 如果k等于0,说明已经找到了第k小的元素,直接返回该元素的值
if k == 0:
return root.val
# 继续遍历该元素的右子树
root = root.right
else:
# 将当前节点压入栈中
stack.append(root)
# 遍历当前节点的左子树
root = root.left