给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
中等难度,这道题和剑指 Offer 54. 二叉搜索树的第k大节点非常的相似,解法也是一样的套路,我们使用中序遍历,然后遍历一次进行k自减1,当k为0时对应的元素就是第k小的节点。
迭代法:
public int kthSmallest(TreeNode root, int k) {
if (root == null) {
return 0;
}
LinkedList<TreeNode> queue = new LinkedList<>();
//中序遍历
while (!queue.isEmpty() || root != null) {
while (root != null) {
queue.addFirst(root);
root = root.left;
}
root = queue.removeFirst();
//如果k为0,则此时节点就是第k小的节点
if (--k == 0) {
return root.val;
}
root = root.right;
}
return 0;
}
递归法:
int k, res;
public int kthSmallest(TreeNode root, int k) {
this.k = k;
dfs(root);
return res;
}
void dfs(TreeNode node) {
if (node == null) {
return;
}
dfs(node.left);
--k;
if (k < 0) {
return;
}
if (k == 0) {
res = node.val;
return;
}
dfs(node.right);
}