Given a binary search tree, write a function kthSmallest
to find the kth smallest element in it.
Note:
You may assume k is always valid, 1 ≤ k ≤ BST's total elements.
给一个BST, 找到第 K 小的数
方法一:
先找到左子树有多少个节点,如果 k 小于等于 cnt, 说明 第 K 小的数 存在于左子树。
如果 k 大于 cnt + 1, 说明 第 K 小的数 存在于右子树。
如果 k 等于 cnt + 1, 返回root的值
public int kthSmallest(TreeNode root, int k) {
int cnt = count_nodes(root.left);
if (k <= cnt) {
return kthSmallest(root.left, k);
}
else if (k > cnt + 1) {
return kthSmallest(root.right, k - cnt - 1);
}
return root.val;
}
private int count_nodes(TreeNode root) {
if (root == null) return 0;
return 1 + count_nodes(root.left) + count_nodes(root.right);
}
方法二:
中序遍历
int cnt;
int res;
public int kthSmallest(TreeNode root, int k) {
cnt = k;
helper(root);
return res;
}
public void helper(TreeNode root) {
if (root == null) return;
helper(root.left);
cnt--;
if (cnt == 0) {
res = root.val;
return;
}
helper(root.right);
}
方法三:
public int kthSmallest(TreeNode root, int k) {
Stack<TreeNode> st = new Stack<>();
while (root != null) {
st.push(root);
root = root.left;
}
while (k != 0) {
TreeNode n = st.pop();
k--;
if (k == 0) return n.val;
TreeNode right = n.right;
while (right != null) {
st.push(right);
right = right.left;
}
}
return -1; // never hit if k is valid
}