给定一个二叉搜索树的根节点 root
,和一个整数 k
,请你设计一个算法查找其中第 k
个最小元素(从 1 开始计数)。
示例 1:
输入:root = [3,1,4,null,2], k = 1
输出:1
示例 2:
输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3
提示:
- 树中的节点数为
n
。 - 1 <=
k
<=n
<= 104 - 0 <=
Node.val
<= 104
思路
思路很简单,因为BST的中序遍历是按序递增的,因此,要查找第k
个最小元素,其实就是中序遍历结果中的第k
个数。
所以,只要设置一个成员变量放在外面(我这里写的是nowK
),初始化为0
,然后中序遍历每次访问到根结点时,先将nowK++
,再看看自加完之后nowK
与给定的k
是否相等,如果相等,则说明已经查找到了第k
个最小元素,记录下它的值即可。
代码
public class Solution {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
int nowK = 0;
int num = 0;
public void inOrder(TreeNode root, int k) {
if(root.left!=null) {
inOrder(root.left, k);
}
nowK++;
if(nowK==k) {
num = root.val;
}
if(root.right!=null) {
inOrder(root.right, k);
}
}
public int kthSmallest(TreeNode root, int k) {
inOrder(root, k);
return num;
}
}