272. 最接近的二叉搜索树值 II
这题先中序遍历得到list,在遍历的时候顺便找到最接近于target的点,之后由这一点出发向左向右找离target最小的点加入到answer的list中输出。
class Solution {
public List<Integer> closestKValues(TreeNode root, double target, int k) {
List<Integer> list=new ArrayList<>();
Stack<TreeNode> stack=new Stack<>();
double number=Double.MAX_VALUE;
int no=0;
while(!stack.isEmpty()||root!=null){
while(root!=null){
stack.push(root);
root=root.left;
}
root=stack.pop();
list.add(root.val);
if(Math.abs(root.val-target)<number){
no=list.size()-1;
number=Math.abs(root.val-target);
}
root=root.right;
}
List<Integer> answer=new ArrayList<>();
answer.add(list.get(no));
int i=no-1;
int j=no+1;
int size=list.size();
while(answer.size()<k){
if(i>=0&&j<size){
if(Math.abs(list.get(i)-target)<=Math.abs(list.get(j)-target)){
answer.add(list.get(i--));
}else{
answer.add(list.get(j++));
}
}
if(i<0){
for(int t=0;t<k-answer.size();){
answer.add(list.get(j++));
}
}
if(j>=size){
for(int t=0;t<k-answer.size();){
answer.add(list.get(i--));
}
}
}
return answer;
}
}