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,感谢您的详细解释。现在清楚多了。