JAVA中递归的前序遍历一直运行到堆栈溢出(BST)

JAVA中递归的前序遍历一直运行到堆栈溢出(BST),java,data-structures,binary-search-tree,abstract-data-type,Java,Data Structures,Binary Search Tree,Abstract Data Type,我正在java中用insert和preorder方法实现简单的二叉搜索树。在堆栈溢出之前,我将执行无限的预订单 以下是节点类: public class Node { private Node right, left; private int data; public Node(Node right, Node left, int data) { super(); this.right = right; this.left = left; this.data =

我正在java中用insert和preorder方法实现简单的二叉搜索树。在堆栈溢出之前,我将执行无限的预订单

以下是节点类:

public class Node {
private Node right, left;
private int data;

public Node(Node right, Node left, int data) {
    super();
    this.right = right;
    this.left = left;
    this.data = data;
}

public Node() {
    super();
    this.right = this.left = null;
    this.data = 0;
}

public Node getRight() {
    return right;
}

public void setRight(Node n) {

    this.right = n;
}

public Node getLeft() {
    return left;
}

public void setLeft(Node n) {
    this.left = n;
}

public int getData() {
    return data;
}

public void setData(int data) {
    this.data = data;
}

}
以下是BinarySearchTree类:

public class BinarySearchTree {

private Node root;

public BinarySearchTree() {
    root = null;
}

public Node insert(int data) {
    root = insertInto(root, data);
    return root;
}

private Node insertInto(Node node, int data) {

    if (node == null) {
        Node temp = new Node();
        temp.setData(data);
        return temp;
    } else if (data < node.getData()) {

        node.setLeft(insertInto(node.getLeft(), data));

    } else if (data > node.getData()) {

        node.setRight(insertInto(node.getRight(), data));

    }

    return root;
}

public void preorder() {
    getPreorder(root);
}

private void getPreorder(Node root) {
    if (root == null)
        return;
    System.out.println(root);
    getPreorder(root.getLeft());
    getPreorder(root.getRight());
}
}
以下是输出:

Node [data=10]
Node [data=10]
Node [data=10]
Node [data=10]
Node [data=10]
Node [data=10]
Node [data=10]
Node [data=10]
Exception in thread "main" java.lang.StackOverflowError
at sun.nio.cs.SingleByte.withResult(Unknown Source)
at sun.nio.cs.SingleByte.access$000(Unknown Source)
at sun.nio.cs.SingleByte$Encoder.encodeArrayLoop(Unknown Source)
at sun.nio.cs.SingleByte$Encoder.encodeLoop(Unknown Source)
at java.nio.charset.CharsetEncoder.encode(Unknown Source)
at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.io.OutputStreamWriter.write(Unknown Source)
at java.io.BufferedWriter.flushBuffer(Unknown Source)
at java.io.PrintStream.write(Unknown Source)
at java.io.PrintStream.print(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at bsTree.BinarySearchTree.getPreorder(BinarySearchTree.java:42)
at bsTree.BinarySearchTree.getPreorder(BinarySearchTree.java:43)
at bsTree.BinarySearchTree.getPreorder(BinarySearchTree.java:43)
at bsTree.BinarySearchTree.getPreorder(BinarySearchTree.java:43)

我认为插入逻辑有问题,无法确定是什么。

问题在于
插入(…)

}else if(data节点.getData()){
setRight(insertInto(node.getRight(),data));
}
返回根;

在这两种情况中的任何一种情况下,最后都会将左/右子节点设置为根节点,这样就创建了一个循环。这就是导致无限递归的原因。

问题在于
插入(…)

}else if(data节点.getData()){
setRight(insertInto(node.getRight(),data));
}
返回根;

在这两种情况中的任何一种情况下,最后都会将左/右子节点设置为根节点,这样就创建了一个循环。这就是导致无限递归的原因。

是的,刚刚弄明白,将尝试添加一个修复,几乎在互联网上的所有地方都写了这个递归逻辑,我想知道是否有一个缓和…,感谢buddyYeah,刚刚弄明白,将尝试添加一个修复,几乎在互联网上所有地方都写了这个递归逻辑,我想知道是否有一种节制…,谢谢老兄
Node [data=10]
Node [data=10]
Node [data=10]
Node [data=10]
Node [data=10]
Node [data=10]
Node [data=10]
Node [data=10]
Exception in thread "main" java.lang.StackOverflowError
at sun.nio.cs.SingleByte.withResult(Unknown Source)
at sun.nio.cs.SingleByte.access$000(Unknown Source)
at sun.nio.cs.SingleByte$Encoder.encodeArrayLoop(Unknown Source)
at sun.nio.cs.SingleByte$Encoder.encodeLoop(Unknown Source)
at java.nio.charset.CharsetEncoder.encode(Unknown Source)
at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.io.OutputStreamWriter.write(Unknown Source)
at java.io.BufferedWriter.flushBuffer(Unknown Source)
at java.io.PrintStream.write(Unknown Source)
at java.io.PrintStream.print(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at bsTree.BinarySearchTree.getPreorder(BinarySearchTree.java:42)
at bsTree.BinarySearchTree.getPreorder(BinarySearchTree.java:43)
at bsTree.BinarySearchTree.getPreorder(BinarySearchTree.java:43)
at bsTree.BinarySearchTree.getPreorder(BinarySearchTree.java:43)
} else if (data < node.getData()) {

    node.setLeft(insertInto(node.getLeft(), data));

} else if (data > node.getData()) {

    node.setRight(insertInto(node.getRight(), data));

}

return root;