您的位置:首页 > 其它

230. Kth Smallest Element in a BST

2016-05-24 22:05 253 查看
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.

Follow up:

What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine?

Hint:
Try to utilize the property of a BST.
What if you could modify the BST node's structure?
The optimal runtime complexity is O(height of BST).

1.我的答案(写的真的很烂)
/**
* 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 kth(TreeNode* root, int& k, int& val){
if(root == NULL){
return;
}
kth(root->left, k, val);
if(k > 1)
k--;
else if(k == 1){
k--;
if(val == 0)
val = root->val;
return;
}
kth(root->right, k, val);
}

int kthSmallest(TreeNode* root, int k) {
int val = 0;
kth(root, k, val);
return val;
}
};


2.别人的答案


3 ways implemented in JAVA: Binary Search, in-order iterative & recursive

(1)Binary Search (dfs): most preferable
public int kthSmallest(TreeNode root, int k) {
int count = countNodes(root.left);
if (k <= count) {
return kthSmallest(root.left, k);
} else if (k > count + 1) {
return kthSmallest(root.right, k-1-count); // 1 is counted as current node
}

return root.val;
}

public int countNodes(TreeNode n) {
if (n == null) return 0;

return 1 + countNodes(n.left) + countNodes(n.right);
}


(2)DFS in-order recursive:
// better keep these two variables in a wrapper class
private static int number = 0;
private static int count = 0;

public int kthSmallest(TreeNode root, int k) {
count = k;
helper(root);
return number;
}

public void helper(TreeNode n) {
if (n.left != null) helper(n.left);
count--;
if (count == 0) {
number = n.val;
return;
}
if (n.right != null) helper(n.right);
}


(2)DFS in-order iterative:
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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: