原题链接在这里:https://leetcode.com/problems/kth-smallest-element-in-a-bst/
Method 1: BST 用in-order遍历出来的就是由小到大,Method1用recursion,会出来一整个list, 然后返回list.get(k-1)即可。
AC Java:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int kthSmallest(TreeNode root, int k) {
List<Integer> ls = new ArrayList<Integer>();
inorder(root,ls);
return ls.get(k-1);
}
private void inorder(TreeNode root, List<Integer> ls){
if(root == null){
return;
}
inorder(root.left,ls);
ls.add(root.val);
inorder(root.right,ls);
}
}
Method 2: 改recursion为iteration, 如此可以不用走完全树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int kthSmallest(TreeNode root, int k) {
Stack<TreeNode> stk = new Stack<TreeNode>();
while(root!=null || !stk.empty()){
if(root != null){
stk.push(root);
root = root.left;
}else{
TreeNode tn = stk.pop();
k--;
if(k == 0){
return tn.val;
}
root = tn.right;
}
}
return -1;
}
}
Method 3: 根据BST性质,看root左子树有多少点,如果正好等于k-1, 则返回root.val, 如果小于k-1, 就在root右子树中找第k-leftSum-1小的点值, 若果大于k-1, 就在左子树中找第k小的点值。
Note: 是返回root.val 不是root.
AC Java:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int kthSmallest(TreeNode root, int k) {
int leftSum = nodeSum(root.left);
if(leftSum == k-1){
return root.val;
}else if(leftSum < k-1){
return kthSmallest(root.right,k-leftSum-1);
}else{
return kthSmallest(root.left,k);
}
}
private int nodeSum(TreeNode root){
if(root == null){
return 0;
}
return nodeSum(root.left)+nodeSum(root.right)+1;
}
}