Closest Binary Search Tree Value II
public class Solution {
/**
* @param root: the given BST
* @param target: the given target
* @param k: the given k
* @return: k values in the BST that are closest to the target
*/
private void findTarget(Stack<TreeNode> stack,TreeNode root,double target){
while (root!=null){
stack.push(root);
if (target<root.val){
root=root.left;
}
else {
root=root.right;
}
}
}
private void getNext(Stack<TreeNode> stack){
TreeNode node=stack.peek();
if (node.right!=null){
node=node.right;
while (node!=null){
stack.push(node);
node=node.left;
}
}
else {
while (!stack.isEmpty()){
node=stack.pop();
if (!stack.isEmpty() && stack.peek().right!=node){
break;
}
}
}
}
private void getPrev(Stack<TreeNode> stack){
TreeNode node=stack.peek();
if (node.left!=null){
node=node.left;
while (node!=null){
stack.push(node);
node=node.right;
}
}
else {
while (!stack.isEmpty()){
node=stack.pop();
if (!stack.isEmpty() && stack.peek().left!=node){
break;
}
}
}
}
public List<Integer> closestKValues(TreeNode root, double target, int k) {
// write your code here
Stack<TreeNode> nextStack=new Stack<>();
Stack<TreeNode> prevStack=new Stack<>();
findTarget(nextStack,root,target);
prevStack.addAll(nextStack);
getPrev(prevStack);
List<Integer> answer=new ArrayList<>();
for (int i=0;i<k;i++){
if (prevStack.isEmpty()){
answer.add(nextStack.peek().val);
getNext(nextStack);
}
else if (nextStack.isEmpty()){
answer.add(prevStack.peek().val);
getPrev(prevStack);
}
else if (target-prevStack.peek().val<nextStack.peek().val-target){
answer.add(prevStack.peek().val);
getPrev(prevStack);
}
else {
answer.add(nextStack.peek().val);
getNext(nextStack);
}
}
return answer;
}
}
最后更新于
这有帮助吗?