1、题目描述
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。
示例 1:
输入:root = [3,1,4,null,2], k = 1
输出:1
2、初始思路
2.1 思路
使用中序遍历(左根右)进行遍历,遍历结果为从小到大的排序,进而可以输出第k小的元素。
# 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:
result = []
def fore(node):
if not node:
return
fore(node.left)
result.append(node.val)
fore(node.right)
fore(root)
return result[k-1]
2.2 缺点
要对整个二叉树进行遍历,运行时间较长
3 优化算法
3.1 思路
使用迭代的方法,不用遍历整个二叉树,减少运行时间。
# 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 or stack:
while root:
stack.append(root)
root = root.left
root = stack.pop()
k -= 1
if k == 0:
return root.val
root = root.right
4 总结
二叉树的遍历参考【二叉树】遍历总结!-CSDN博客