寻找二叉搜索树的第K小的节点
2016-08-13 11:46
337 查看
题目要求:
Question
Editorial Solution
My Submissions
Total Accepted: 58991
Total Submissions: 148753
Difficulty: Medium
Given a binary search tree, write a function
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).
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
三种解法:
public int kthSmallest(TreeNode root, int k) {
int count=countNodes(root.left)+1;
if(k==count) return root.val;
if(k<count) return kthSmallest(root.left,k);
else{
return kthSmallest(root.right,k-count);
}
}
public int countNodes(TreeNode root){
if(root==null) return 0;
return 1+countNodes(root.left)+countNodes(root.right);
}以上解法最漂亮,用到了二叉树的结构特性与题目要求
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);
}上面的解法就是中序遍历的解法,count 与 number 都应设置喂全局变量
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
}第三种解法应用了一个栈,与使用队列的效果是一样的,但是在可理解性上不如应用队列。
230. Kth Smallest Element in a BST
Question
Editorial Solution
My Submissions
Total Accepted: 58991
Total Submissions: 148753
Difficulty: Medium
Given a binary search tree, write a function
kthSmallestto
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).
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
三种解法:
public int kthSmallest(TreeNode root, int k) {
int count=countNodes(root.left)+1;
if(k==count) return root.val;
if(k<count) return kthSmallest(root.left,k);
else{
return kthSmallest(root.right,k-count);
}
}
public int countNodes(TreeNode root){
if(root==null) return 0;
return 1+countNodes(root.left)+countNodes(root.right);
}以上解法最漂亮,用到了二叉树的结构特性与题目要求
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);
}上面的解法就是中序遍历的解法,count 与 number 都应设置喂全局变量
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
}第三种解法应用了一个栈,与使用队列的效果是一样的,但是在可理解性上不如应用队列。
相关文章推荐
- 【算法面试题】寻找二叉搜索树中两个节点的最近公共祖先节点(转)
- 二叉搜索树的第K大节点
- 剑指Offer——二叉搜索树中第K大的节点
- 二叉搜索树第k大个节点
- 寻找二叉搜索树的后继节点
- 每天一道LeetCode-----寻找二叉搜索树中第k小的元素
- 【剑指offer】面试题54:二叉搜索树的第k大节点
- 二叉搜索树的第k小节点
- 找出二叉搜索树第k大的节点
- 剑指offer(64):二叉搜索树的第k大的节点
- 剑指Offer-54:二叉搜索树的第k大节点
- 剑指_43_二叉搜索树第k大节点
- 在二叉搜索树里,寻找两个节点 Find a pair with given sum in a Balanced BST
- [CareerCup] 4.6 Find Next Node in a BST 寻找二叉搜索树中下一个节点
- [转] 寻找第k大的数
- 剑指offer_二叉搜索树的第k个节点
- 寻找父节点
- 单向还链表如何寻找起始节点
- 专题:二叉搜索树节点的删除
- 分治法 寻找第K小元素