遍历二叉树并返回值

时间:2014-08-27 15:11:40

标签: 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 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;
}

1 个答案:

答案 0 :(得分:0)

  

...仍然有点模糊的递归

听起来更像是局部变量有点模糊。

调用函数时,Java会将激活记录(AR)推送到调用堆栈。 AR包含所有函数args和局部变量。

当一个函数返回时,它的AR会从堆栈弹出并被丢弃,并且它的所有args和locals都会消失。

每次通话都会获得拥有的 AR。因此,对nearest(...)的每次递归调用都会获取其自己的 candidate变量。当您的代码调用nearest(...,candidate)时,新的激活会更改 candidate变量,但这对调用者的candidate没有影响。当内部调用返回时,内部激活中的candidate被抛弃。这就是Jon Skeet在谈到“价值传递的论点”时的意思。

您只能将 in 中的参数传递给函数。要重新获得回报,您必须使用返回值,否则您必须将 in 传递给函数可以修改的某个对象。