Java 递归填充溢出

Java 递归填充溢出,java,recursion,Java,Recursion,当我看到一个问题时,我建议递归地填充一个节点网格,我想我应该自己尝试一下代码,下面的代码一直在溢出 public class Node { private Node left; private Node right; private Node up; private Node down; private int x; private int y; public Node(int x, int y) { this.x = x; this.y = y; } public sta

当我看到一个问题时,我建议递归地填充一个节点网格,我想我应该自己尝试一下代码,下面的代码一直在溢出

public class Node {

private Node left;
private Node right;
private Node up;
private Node down;
private int x;
private int y;

public Node(int x, int y) {
    this.x = x;
    this.y = y;
}

public static void buildGrid(Node node) {
    fill(node);
}

private static void fill(Node node) {
    fillLeft(node);
    fillRight(node);
}

private static void fillRight(Node node) {
    if (node.right != null || node.x > 10)
        return;

    node.right = new Node(node.x + 1, node.y);
    fill(node.right);
}

private static void fillLeft(Node node) {
    if (node.left != null || node.x <= 0)
        return;

    node.left = new Node(node.x - 1, node.y);
    fill(node.left);
}

public static void main(String[] args) {
    Node node = new Node(5, 5);
    buildGrid(node);
}

您的问题是没有正确创建新节点之间的链接。你想要:

private static void fillRight(Node node) {
    if (node.right != null || node.x > 10)
        return;

    node.right = new Node(node.x + 1, node.y);
    node.right.left = node; // CURRENT NODE IS LEFT OF NEW NODE!
    fill(node.right);
}

private static void fillLeft(Node node) {
    if (node.left != null || node.x <= 0)
        return;

    node.left = new Node(node.x - 1, node.y);
    node.left.right = node; // CURRENT NODE IS RIGHT OF NEW NODE!
    fill(node.left);
}
第二:递归网格填充很快变得混乱,很容易导致高递归深度和快速溢出。对于这些类型的事情,你最好使用队列,而不是递归地执行它。

fillRight()
调用
fillRight()
,对于left也一样


当前它正在创建一个新节点,然后在此节点上调用
fill()
,该节点具有空的左/右指针…

您的fillLeft和fillRight将永远不会命中条件节点。left!=null和节点。右!=null,它将停止递归


看起来x和y是您的密钥,您必须基于x和y将它们存储在某个位置,并在它们已经创建时检索它们,而不是总是调用新节点。

您得到的确切异常跟踪是什么?可能是java的隐式堆栈由于所有递归而溢出。请展示您的
节点
构造函数。这是真的,但更奇怪的是,我不想在真实环境中这样做,但奇怪的是,它只溢出x上的10个节点,我省略了沿y填充,因为它只溢出一个维度。@arynaq您没有完全设置节点之间的双向链接。我已经更新了我的答案。当然,现在看起来很傻,这是我在06:21编码得到的,谢谢你,我会无法入睡,就像这样让我发疯。
private static void fillRight(Node node) {
    if (node.right != null || node.x > 10)
        return;

    node.right = new Node(node.x + 1, node.y);
    node.right.left = node; // CURRENT NODE IS LEFT OF NEW NODE!
    fill(node.right);
}

private static void fillLeft(Node node) {
    if (node.left != null || node.x <= 0)
        return;

    node.left = new Node(node.x - 1, node.y);
    node.left.right = node; // CURRENT NODE IS RIGHT OF NEW NODE!
    fill(node.left);
}
private static void fill(Node node) {
    System.out.println("filling node " + node.x + " " + node.y + 
                       " " + node.left + " " + node.right); 
    ...