思路在注释
思路挺简单的
你如果遇到traverse到底是一个参数还是2个参数
看一下主函数有没有参数要传给子函数的,有的话,可能就需要2个参数
traverse建议还是void类型好
class Solution {
public int closestValue(TreeNode root, double target) {
/*
double min;
int number;
if(root == null)
return
traverse(root.left)
if(|root.val - target | < min)
更新number
min = |root.val - target|
else
不做什么
traverse(root.right)
*/
traverse(root,target);
return number;
}
double min = 2000000001.0;
int number = 0;
void traverse(TreeNode root,double target){
if(root == null){
return;
}
traverse(root.left,target);
if(Math.abs(root.val - target) < min){
number = root.val;
min = Math.abs(root.val - target);
}else{
}
traverse(root.right,target);
}
}
当然这个题你还可以用性质做
你最开始想的就是这种
class Solution {
int res = 0;
public int closestValue(TreeNode root, double target) {
res = root.val;
traverse(root, target);
return res;
}
// 遍历函数,在 BST 中搜索 target
void traverse(TreeNode root, double target) {
if (root == null) {
return;
}
// 一边搜索一边更新离 target 最近的值
if (Math.abs(root.val - target) < Math.abs(res - target)) {
res = root.val;
}
// 根据 target 和 root.val 的相对大小决定去左右子树搜索
if (root.val < target) {
traverse(root.right, target);
} else {
traverse(root.left, target);
}
}
}