二叉搜索树中第K小的元素
给定一个二叉搜索树,编写一个函数 kthSmallest
来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2 输出: 1
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1 输出: 3
进阶:
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化kthSmallest
函数?
解答
中序遍历二叉搜索树,在遍历的过程中,每经过一个节点将k
减1,当k == 0
的时候,则找到了第k小的元素(注意边界
)。
C++代码
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: void recursion(TreeNode* root,int& res,int& k) { if(!root) return; recursion(root->left,res,k); k--; if(k == 0) { res = root->val; return; } recursion(root->right,res,k); } int kthSmallest(TreeNode* root, int k) { int res; recursion(root,res,k); return res; } };
Python代码
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def kthSmallest(self, root: TreeNode, k: int) -> int: self.k = k self.inorder(root) return self.res def inorder(self,root) -> bool: if root is None: return False if self.inorder(root.left): return True self.k -= 1 if self.k == 0: self.res = root.val return True if self.inorder(root.right): return True return False
文章来源: https://blog.csdn.net/xie810005152/article/details/90312356