Рубрики
Без рубрики

День 47: Бинарное Дерево Поиска

Конструктор: public BinarySearchTree() { ; } Введите полноэкранный режим mo… Помеченный 100daysofcode, java.

Конструктор:

    public BinarySearchTree() {
        root = null;
    }

Проверьте, пусто ли дерево:

    public boolean isEmpty() {
        return root == null;
    }

Вставка данных:

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

Вставка данных рекурсивно:

    private BSTNode insert(BSTNode node, int data) {
        if (node == null) {
            node = new BSTNode(data);
        } else if (data <= node.getData()) {
            node.left = insert(node.left, data);
        } else {
            node.right = insert(node.right, data);
        }
        return node;
    }

Удаление данных:

    public void delete(int k) {
        if (isEmpty()) {
            System.out.println("Tree Empty");
        } else if (search(k) == false) {
            System.out.println("Sorry " + k + " is not present");
        } else {
            root = delete(root, k);
            System.out.println(k + " deleted from the tree");
        }
    }

    private BSTNode delete(BSTNode root, int k) {
        BSTNode p, p2, n;
        if (root.getData() == k) {
            BSTNode lt, rt;
            lt = root.getLeft();
            rt = root.getRight();
            if (lt == null && rt == null) {
                return null;
            } else if (lt == null) {
                p = rt;
                return p;
            } else if (rt == null) {
                p = lt;
                return p;
            } else {
                p2 = rt;
                p = rt;
                while (p.getLeft() != null) {
                    p = p.getLeft();
                }
                p.setLeft(lt);
                return p2;
            }
        }
        if (k < root.getData()) {
            n = delete(root.getLeft(), k);
            root.setLeft(n);
        } else {
            n = delete(root.getRight(), k);
            root.setRight(n);
        }
        return root;
    }

Подсчитайте узлы:

    public int countNodes() {
        return countNodes(root);
    }

Подсчитайте узлы рекурсивно:

    private int countNodes(BSTNode r) {
        if (r == null) {
            return 0;
        } else {
            int l = 1;
            l += countNodes(r.getLeft());
            l += countNodes(r.getRight());
            return l;
        }
    }

Поиск по дереву:

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

Рекурсивный поиск по дереву:

    private boolean search(BSTNode r, int val) {
        boolean found = false;
        while ((r != null) && !found) {
            int rval = r.getData();
            if (val < rval) {
                r = r.getLeft();
            } else if (val > rval) {
                r = r.getRight();
            } else {
                found = true;
                break;
            }
            found = search(r, val);
        }
        return found;
    }

Обходы по дереву:

Обход по порядку

    public List inorder() {
        List walk = new ArrayList<>();
        inorder(root, walk);
        return walk;
    }

    private void inorder(BSTNode r, List walk) {
        if (r != null) {
            inorder(r.getLeft(), walk);
            System.out.print(r.getData() + " ");
            walk.add(r);
            inorder(r.getRight(), walk);
        }
    }

Предварительный заказ

    public List preorder() {
        List walk = new ArrayList<>();
        preorder(root, walk);
        return walk;
    }

    private void preorder(BSTNode r, List walk) {
        if (r != null) {
            System.out.print(r.getData() + " ");
            walk.add(r);
            preorder(r.getLeft(), walk);
            preorder(r.getRight(), walk);
        }
    }

Почтовый заказ

    public List postorder() {
        List walk = new ArrayList<>();

        postorder(root, walk);
        return walk;
    }

    private void postorder(BSTNode r, List walk) {
        if (r != null) {
            postorder(r.getLeft(), walk);
            postorder(r.getRight(), walk);
            System.out.print(r.getData() + " ");
            walk.add(r);
        }
    }
}

Оригинал: “https://dev.to/mattryanmtl/day-47-binary-search-tree-1lf3”