Einführung in den Binären Suchbaum (BST)

Anwendungsfall für automatisches Testen (Unit-Tests)

https://slides.com/d/klgllCM/live

Was ist ein Binärer Suchbaum (BST)?

  • Definition: Ein Binärer Suchbaum ist eine Datenstruktur, bei der jeder Knoten höchstens zwei Kinder hat.
  • Eigenschaften:
    • Der linke Unterbaum eines Knotens enthält nur Knoten mit Werten kleiner als der Wert des Knotens.
    • Der rechte Unterbaum enthält nur Knoten mit Werten größer als der Wert des Knotens.

Was ist ein Binärer Suchbaum (BST)?

Beispiel

Klassenschnittstelle

BinarySearchTree.java

/**
 * A class representing a Binary Search Tree (BST).
 */
public class BinarySearchTree {

    /**
     * Inserts a value into the binary search tree.
     *
     * @param value The value to be inserted.
     */
    public void insert(int value) {
        // TODO: Implement the insert method
    }

    /**
     * Searches for a value in the binary search tree.
     *
     * @param value The value to search for.
     * @return true if the value is found, false otherwise.
     */
    public boolean search(int value) {
        // TODO: Implement the search method
        return false;
    }
}

Testfälle definieren

BinarySearchTreeTest.java

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class BinarySearchTreeTest {

    @Test
    public void testInsertAndSearch() {
        BinarySearchTree bst = new BinarySearchTree();

        // Insert values into the BST
        bst.insert(50);
        bst.insert(30);
        bst.insert(20);
        bst.insert(40);
        bst.insert(70);
        bst.insert(60);
        bst.insert(80);

        // Test searching for values
        assertTrue(bst.search(50), "The value 50 should be found in the tree.");
        assertTrue(bst.search(30), "The value 30 should be found in the tree.");
        assertTrue(bst.search(20), "The value 20 should be found in the tree.");
        assertTrue(bst.search(40), "The value 40 should be found in the tree.");
        assertTrue(bst.search(70), "The value 70 should be found in the tree.");
        assertTrue(bst.search(60), "The value 60 should be found in the tree.");
        assertTrue(bst.search(80), "The value 80 should be found in the tree.");

        // Test searching for non-existent values
        assertFalse(bst.search(90),
                    "The value 90 should not be found in the tree.");
        assertFalse(bst.search(15),
                    "The value 15 should not be found in the tree.");
    }
}

Implementierung durch Schüler

Hinweis für die Knoten

    private class Node {
    int value;
    Node left, right;

    Node(int item) {
        value = item;
        left = right = null;
    }
}

Do it now!

BinarySearchTree.java (Implementierung)

public class BinarySearchTree {

    private class Node {
        int value;
        Node left, right;

        Node(int item) {
            value = item;
            left = right = null;
        }
    }

    private Node root;

    public void insert(int value) {
        root = insertRec(root, value);
    }

	//...
}

BinarySearchTree.java (Implementierung)

public class BinarySearchTree {
    //...

    private Node insertRec(Node root, int value) {
        if (root == null) {
            root = new Node(value);
            return root;
        }
        if (value < root.value) {
            root.left = insertRec(root.left, value);
        } else if (value > root.value) {
            root.right = insertRec(root.right, value);
        }
        return root;
    }

    public boolean search(int value) {
        return searchRec(root, value);
    }

    //...
}

BinarySearchTree.java (Implementierung)

public class BinarySearchTree {
    //...

    public boolean search(int value) {
        return searchRec(root, value);
    }

    private boolean searchRec(Node root, int value) {
        if (root == null) {
            return false;
        }
        if (root.value == value) {
            return true;
        }
        if (value < root.value) {
            return searchRec(root.left, value);
        }
        return searchRec(root.right, value);
    }
}

Zusammenfassung

  • Schnittstelle bereitstellen: Klasse mit leeren Methoden und Kommentaren als Anforderung.
  • Testfälle definieren: Schreiben von Tests zur Verifikation der Funktionalität.
  • Implementierung: Schüler implementieren die Methoden basierend auf der Schnittstelle und den Tests.

"Ein guter Test ist einer, der einen Fehler findet. Ein großartiger Test ist einer, der viele Fehler findet." — Boris Beizer

07 Einführung in den Binären Suchbaum (BST)

By Harald Haberstroh

07 Einführung in den Binären Suchbaum (BST)

  • 88