[HELP] Ошибка Java StackOverflow с рекурсивной вставкой BST - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь написать BST с рекурсивным методом Insert, но мне показалось, что я застрял на строке, где программа не выпрыгивает.

Это работает, если ключи элементов отсортированы во время вызовавставить из Main, он не работает, если они не отсортированы, и я не могу понять, почему.

public static void main(String[] args) {

    BST bst = new BST();

    bst.insert(2,"Val_0");
    bst.insert(1,"Val_1");
}

public class BSTNode {

public int key;
public String val;
public BSTNode left, right, parent;

public BSTNode(int key, String val) {
    this.key = key;
    this.val = val;
    this.left = new BSTNode();
    this.right = new BSTNode();
    this.parent = new BSTNode();
}

public BSTNode() {
    // TODO Auto-generated constructor stub
}

}

public class BST {

private BSTNode root;
public BST() {
    this.root = null;   
} 

    public void insert(int key, String val) {

    root = insertRec(new BSTNode(key,val));
    }

    private BSTNode insertRec(BSTNode node) {

    if (root == null) {
        root = node;
        return root;
    }

    if (node.key < root.key) {
        root.left = insertRec(root.left);
        root.left.parent = root;



    }if( node.key > root.key) {
        root.right = insertRec(root.right);
        root.left.parent = root;
    }


    return node;
     }
}

Ошибка: исключение в потоке "main" java.lang.StackOverflowError, отладчик показывает цикл в файле node.key

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

Исправлено: мой конструктор каждый раз создавал элементы для левого, правого и родительского элементов вместе с методом вставки.

public class BSTNode {

public int key;
public String val;
public BSTNode left, right, parent;

public BSTNode(int key, String val) {
    this.key = key;
    this.val = val;
    this.left = null;
    this.right = null;
    this.parent = null;
}

------ // ---------- Также немного изменил методы:

public void insert(int key, String val) {
    root = insertRec(root, new BSTNode(key,val));

}

private BSTNode insertRec(BSTNode currentParent,BSTNode node) {
    if (currentParent == null) {
        return node;
    }

    if (node.key < currentParent.key) {
        currentParent.left = insertRec(currentParent.left,node);
        currentParent.left.parent = currentParent;

    }if(node.key > currentParent.key) {
        currentParent.right = insertRec(currentParent.right,node);
        currentParent.right.parent = currentParent;
    }


    return currentParent;
}
0 голосов
/ 09 ноября 2019
if (node.key < root.key) {
    root.left = insertRec(root.left);
} else if( node.key > root.key) {
    root.right = insertRec(root.right);
}

Вам не нужно снова устанавливать родителя. Идея рекурсии состоит в том, чтобы идти вперед, а не переназначать назад.

Надеюсь, это поможет. Удачи.

...