Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 遍历二叉树并返回值_Java_Binary Tree_Traversal - Fatal编程技术网

Java 遍历二叉树并返回值

Java 遍历二叉树并返回值,java,binary-tree,traversal,Java,Binary Tree,Traversal,谁能给我解释一下我的代码有什么问题吗。假设遍历整个树并返回最接近查询点的点 public Point2D nearest(Point2D point) { Point2D nearest; if (root == null) { return null; } nearest = nearest(root, point, root.point); return nearest; } private Point2D nearest(Node

谁能给我解释一下我的代码有什么问题吗。假设遍历整个树并返回最接近查询点的点

public Point2D nearest(Point2D point) {
    Point2D nearest;
    if (root == null) {
        return null;
    }
    nearest = nearest(root, point, root.point);
    return nearest;
}

private Point2D nearest(Node node, Point2D point, Point2D candidate) {
    if (node == null) {
        return candidate;
    }
    if (point.distanceTo(node.point) < point.distanceTo(candidate)) {
        candidate = node.point;
    }
    nearest(node.leftBottom, point, candidate);
    nearest(node.rightTop, point, candidate);
    return candidate;
}
公共点2D最近点(点2D点){
点2D最近;
if(root==null){
返回null;
}
最近的=最近的(根、点、根、点);
最近的返回;
}
私有点2D最近(节点节点、点2D点、点2D候选){
if(node==null){
返回候选人;
}
if(点距离到(节点点)<点距离到(候选点)){
候选节点=node.point;
}
最近(node.leftBottom、point、候选者);
最近的(node.rightop、point、候选者);
返回候选人;
}
…仍然有点模糊的重新递归

听起来你对局部变量有点模糊

调用函数时,Java将激活记录(AR)推送到调用堆栈上。AR保存所有函数参数和局部变量

当一个函数返回时,它的AR从堆栈中弹出并丢弃,它的所有参数和局部变量都消失

每个调用都有自己的AR。因此,对最近(…)的每个递归调用都有自己的
候选变量。当您的代码调用最近的(…,候选者)
时,新激活会更改其
候选者
变量,但这对调用方的
候选者
没有影响。当内部调用返回时,内部激活中的
候选者将被丢弃。这就是Jon Skeet所说的“参数按值传递”的意思


只能将参数传入函数。要将aything返回,您必须使用返回值,否则必须传入对函数可以修改的某个对象的引用。

您是否尝试过用print语句调试代码?也许这会有帮助。嗨,为了让我们提供适当的帮助,你需要说出你看到了什么不正确的行为,以及你期望的是什么。举一个例子,可能是树的例子,会有很大帮助。提示:您正在递归调用
最近的
,但忽略返回值…@user2573222:您是否希望调用
最近的
来更改调用方法中的
候选
的值?那是不会发生的。在Java中,参数是按值传递的。别忘了,打电话的人只会看到第一个电话返回的内容。。。不是最里面的调用返回的结果。@user2573222:我们考虑一下您希望使用递归调用的结果。我怀疑你只是想要
candidate=最近的(…)而不是调用方法并忽略结果…James,感谢您的详细解释。现在清楚多了。