почему средний рост моего BST такой высокий?

#java #binary-search-tree

Вопрос:

в настоящее время я работаю над проектом uni, и у меня возникли некоторые трудности с моим двоичным деревом поиска, каждый узел должен иметь значение, но также и случайное «значение баланса», которое находится в диапазоне от 0 до 1, если значение баланса узлов больше, чем у его родителей, то дерево необходимо повернуть влево или вправо в зависимости от стороны, на которой сидит ребенок.

 public class RandomBST {
    class Node {
        int x;
        double balanceValue;
        Node parent;
        Node LChild;
        Node RChild;

        public Node(int i, double b) {
            x = i;
            balanceValue = b;
            parent = this;
            LChild = RChild =  null;
        }
    }

    Node root;

    public double randomDouble() {
        Random Ran = new Random();
        return (0   (1 - 0) * Ran.nextDouble());
    }

    public void insert(int i) {
        double b = randomDouble();
        root = Rec_insert(root, i, b);
        Node p = findParent(root,i,-1);
        if (p.balanceValue < b ){
            if (p.x > i){
                rotateLeft();
            }else{
                rotateRight();
            }
        }
    }

    Node Rec_insert(Node root, int i, double b) {
        if (root == null) {
            root = new Node(i, b);
            return root;
        }
        if (i < root.x)
            root.LChild = Rec_insert(root.LChild, i, b);
        else if (i > root.x)
            root.RChild = Rec_insert(root.RChild, i, b);


        return root;
    }

    static Node findParent(Node node,int i, int parent) {
        if (node == null)
            return null;
        if (node.x == i) {
            return node.parent;
        } else {
            findParent(node.LChild, i, node.x);
            findParent(node.RChild, i, node.x);
        }
        return node.parent;
    }



    int findMax(int a, int b){
        if(a >= b)
            return a;
        else
            return b;
    }

    int findHeight(Node root){
        if(root == null)
            return 0;

        return findMax(findHeight(root.LChild), findHeight(root.RChild))   1;
    }
    
    public void rotateRight(){
        Node previoius = root;
        if (root.RChild!=null){
            root = root.RChild;
        }
        previoius.RChild = root.LChild;
        root.LChild = previoius;
    }
    
    public void rotateLeft(){
        Node previoius = root;
        if (root.LChild!=null){
            root = root.LChild;
        }
        previoius.LChild = root.RChild;
        root.RChild = previoius;
    }

 public static void main(String[] args) {
        int total = 0;
        for (int j = 0; j<1000;j  ) {
            RandomBST RBST = new RandomBST();
            for (int i = 0; i < 1000; i  ) {
                RBST.insert(i);
            }
            int height = RBST.findHeight(RBST.root);
            total =total   height;
        }
        System.out.println(total/1000);

    }

}
 

любые предложения о том, где я ошибаюсь, были бы фантастическими, результат должен быть примерно от 20 до 21, но я получаю около 850.

Комментарии:

1. В этом коде слишком много ошибок. Например, parent член всегда является ссылкой на самого себя, поэтому вся логика, которая от него зависит, идет не так. Другое дело: вращения идут неправильно, когда if условие внутри метода вращения ложно. Также: вы уверены, что должны вставлять значения в порядке возрастания? Я бы посоветовал вам процитировать задание буквально.

2. да значения должны быть вставлены в порядке возрастания

3. Можете ли вы отредактировать свой вопрос и процитировать задание/задачу?

4. Приведенный выше комментарий коснулся лишь нескольких проблем. Есть и еще кое-что: findParent метод всегда заканчивается возвращением родителя данного узла, не обязательно родителя узла с заданным значением. Последний аргумент findParent никогда не используется… Вам действительно следует отладить свой код, выполнив работу только с одним деревом и, скажем, с 5 узлами (0, 1, 2, 3, 4). Отладьте и проверьте переменные. В этом коде слишком много проблем.

5. Вы уверены, что вам нужно повернуть корень дерева, а не родительский элемент вставленного узла?

Ответ №1:

Создание совершенно нового генератора случайных чисел с

 Random Ran = new Random();
 

может составить ваше случайное число …немного случайно.

Создайте один генератор в своем приложении и направляйте на него все вызовы.

Комментарии:

1. спасибо вам за это предложение, оно по-прежнему возвращает в среднем около 850, так что это не проблема, но все равно спасибо!

2. @danCodes, как получилось, что вы отметили этот ответ как принятый, так как в то же время вы говорите, что это не решило проблему?