ืขืฅ ื‘ื™ื ืืจื™ ืื• ื›ื™ืฆื“ ืœื”ื›ื™ืŸ ืขืฅ ื—ื™ืคื•ืฉ ื‘ื™ื ืืจื™

ืคืจืœื•ื“

ืžืืžืจ ื–ื” ืขื•ืกืง ื‘ืขืฆื™ ื—ื™ืคื•ืฉ ื‘ื™ื ืืจื™ื™ื. ืœืื—ืจื•ื ื” ื›ืชื‘ืชื™ ืžืืžืจ ืขืœ ื“ื—ื™ืกืช ื ืชื•ื ื™ื ื‘ืฉื™ื˜ืช ื”ืืคืžืŸ. ืฉื ืœื ืžืžืฉ ืฉืžืชื™ ืœื‘ ืœืขืฆื™ื ื‘ื™ื ืืจื™ื™ื, ื›ื™ ืฉื™ื˜ื•ืช ื”ื—ื™ืคื•ืฉ, ื”ื”ื›ื ืกื”, ื”ืžื—ื™ืงื” ืœื ื”ื™ื• ืจืœื•ื•ื ื˜ื™ื•ืช. ืขื›ืฉื™ื• ื”ื—ืœื˜ืชื™ ืœื›ืชื•ื‘ ืžืืžืจ ืขืœ ืขืฆื™ื. ืื•ืœื™ ื ืชื—ื™ืœ.

ืขืฅ ื”ื•ื ืžื‘ื ื” ื ืชื•ื ื™ื ื”ืžื•ืจื›ื‘ ืžืฆืžืชื™ื ื”ืžื—ื•ื‘ืจื™ื ื‘ืงืฆื•ื•ืช. ืื ื• ื™ื›ื•ืœื™ื ืœื•ืžืจ ืฉืขืฅ ื”ื•ื ืžืงืจื” ืžื™ื•ื—ื“ ืฉืœ ื’ืจืฃ. ื”ื ื” ืขืฅ ืœื“ื•ื’ืžื”:

ืขืฅ ื‘ื™ื ืืจื™ ืื• ื›ื™ืฆื“ ืœื”ื›ื™ืŸ ืขืฅ ื—ื™ืคื•ืฉ ื‘ื™ื ืืจื™

ื–ื” ืœื ืขืฅ ื—ื™ืคื•ืฉ ื‘ื™ื ืืจื™! ื”ื›ืœ ืชื—ืช ื—ืชืš!

ื˜ืจืžื™ื ื•ืœื•ื’ื™ื”

ืฉื•ืจืฉ

ืฉื•ืจืฉ ืขืฅ ื”ื•ื ื”ืฆื•ืžืช ื”ืขืœื™ื•ืŸ. ื‘ื“ื•ื’ืžื”, ื–ื”ื• ืฆื•ืžืช A. ื‘ืขืฅ, ืจืง ื ืชื™ื‘ ืื—ื“ ื™ื›ื•ืœ ืœื”ื•ื‘ื™ืœ ืžื”ืฉื•ืจืฉ ืœื›ืœ ืฆื•ืžืช ืื—ืจ! ืœืžืขืฉื”, ื›ืœ ืฆื•ืžืช ื™ื›ื•ืœ ืœื”ื™ื—ืฉื‘ ื›ืฉื•ืจืฉ ืชืช-ื”ืขืฅ ื”ืžืชืื™ื ืœืฆื•ืžืช ื–ื”.

ื”ื•ืจื™ื/ืฆืืฆืื™ื

ืœื›ืœ ื”ืฆืžืชื™ื ืžืœื‘ื“ ื”ืฉื•ืจืฉ ื™ืฉ ืงืฆื” ืื—ื“ ื‘ื“ื™ื•ืง ื”ืžื•ื‘ื™ืœ ืœืฆื•ืžืช ืื—ืจ. ื”ืฆื•ืžืช ืฉืžืขืœ ื”ืฆื•ืžืช ื”ื ื•ื›ื—ื™ ื ืงืจื ื”ื•ึนืจึถื” ื”ืฆื•ืžืช ื”ื–ื”. ืฆื•ืžืช ืฉื ืžืฆื ืžืชื—ืช ืœื–ื” ื”ื ื•ื›ื—ื™ ื•ืžื—ื•ื‘ืจ ืืœื™ื• ื ืงืจื ืฆืึฑืฆื ื”ืฆื•ืžืช ื”ื–ื”. ื‘ื•ืื• ื ื™ืงื— ื“ื•ื’ืžื”. ืงื— ืืช ืฆื•ืžืช B, ื•ืื– ื”ืื‘ ืฉืœื• ื™ื”ื™ื” ืฆื•ืžืช A, ื•ื”ื™ืœื“ื™ื ืฉืœื• ื™ื”ื™ื• ืฆืžืชื™ื D, E ื•-F.

ื’ื™ืœื™ื•ืŸ

ืฆื•ืžืช ืฉืื™ืŸ ืœื• ื™ืœื“ื™ื ื ืงืจื ืขืœื” ืฉืœ ื”ืขืฅ. ื‘ื“ื•ื’ืžื”, ื”ืฆืžืชื™ื D, E, F, G, I, J, K ื™ื”ื™ื• ืขืœื™ื.

ื–ื”ื• ื”ืžื™ื ื•ื— ื”ื‘ืกื™ืกื™. ืžื•ืฉื’ื™ื ืื—ืจื™ื ื™ื™ื“ื•ื ื• ื‘ื”ืžืฉืš. ืื–, ืขืฅ ื‘ื™ื ืืจื™ ื”ื•ื ืขืฅ ืฉื‘ื• ืœื›ืœ ืฆื•ืžืช ื™ื”ื™ื• ืœื ื™ื•ืชืจ ืžืฉื ื™ ื™ืœื“ื™ื. ื›ืคื™ ืฉื ื™ื—ืฉืชื, ื”ืขืฅ ืžื”ื“ื•ื’ืžื” ืœื ื™ื”ื™ื” ื‘ื™ื ืืจื™, ื›ื™ ืœืฆืžืชื™ื B ื•-H ื™ืฉ ื™ื•ืชืจ ืžืฉื ื™ ื™ืœื“ื™ื. ื”ื ื” ื“ื•ื’ืžื” ืœืขืฅ ื‘ื™ื ืืจื™:

ืขืฅ ื‘ื™ื ืืจื™ ืื• ื›ื™ืฆื“ ืœื”ื›ื™ืŸ ืขืฅ ื—ื™ืคื•ืฉ ื‘ื™ื ืืจื™

ื”ืฆืžืชื™ื ืฉืœ ื”ืขืฅ ื™ื›ื•ืœื™ื ืœื”ื›ื™ืœ ื›ืœ ืžื™ื“ืข. ืขืฅ ื—ื™ืคื•ืฉ ื‘ื™ื ืืจื™ ื”ื•ื ืขืฅ ื‘ื™ื ืืจื™ ื‘ืขืœ ื”ืžืืคื™ื™ื ื™ื ื”ื‘ืื™ื:

  1. ืชืชื™ ืขืฅ ืฉืžืืœื™ ื•ื™ืžื™ืŸ ื”ื ืขืฆื™ ื—ื™ืคื•ืฉ ื‘ื™ื ืืจื™ื™ื.
  2. ืœื›ืœ ื”ืฆืžืชื™ื ืฉืœ ืชืช-ื”ืขืฅ ื”ืฉืžืืœื™ ืฉืœ ืฆื•ืžืช X ืฉืจื™ืจื•ืชื™ ื™ืฉ ืขืจื›ื™ ืžืคืชื— ื ืชื•ื ื™ื ืคื—ื•ืชื™ื ืžืขืจืš ืžืคืชื— ื”ื ืชื•ื ื™ื ืฉืœ ืฆื•ืžืช X ืขืฆืžื•.
  3. ืœื›ืœ ื”ืฆืžืชื™ื ืฉืœ ืชืช-ื”ืขืฅ ื”ื™ืžื ื™ ืฉืœ ืฆื•ืžืช ืฉืจื™ืจื•ืชื™ X ื™ืฉ ืขืจื›ื™ ืžืคืชื— ื ืชื•ื ื™ื ื’ื“ื•ืœื™ื ืื• ืฉื•ื•ื™ื ืœืขืจืš ืฉืœ ืžืคืชื— ื”ื ืชื•ื ื™ื ืฉืœ ืฆื•ืžืช X ืขืฆืžื•.

ืžืคืชื— - ืžืืคื™ื™ืŸ ื›ืœืฉื”ื• ืฉืœ ื”ืฆื•ืžืช (ืœื“ื•ื’ืžื”, ืžืกืคืจ). ื”ืžืคืชื— ื ื—ื•ืฅ ื›ื“ื™ ืœื”ื™ื•ืช ืžืกื•ื’ืœ ืœืžืฆื•ื ืืช ืืœืžื ื˜ ื”ืขืฅ ืฉืืœื™ื• ืžืงืฉ ื–ื” ืžืชืื™ื. ื“ื•ื’ืžื” ืœืขืฅ ื—ื™ืคื•ืฉ ื‘ื™ื ืืจื™:

ืขืฅ ื‘ื™ื ืืจื™ ืื• ื›ื™ืฆื“ ืœื”ื›ื™ืŸ ืขืฅ ื—ื™ืคื•ืฉ ื‘ื™ื ืืจื™

ื ื•ืฃ ืขืฅ

ื›ื›ืœ ืฉืืžืฉื™ืš, ืื›ืœื•ืœ ื›ืžื” ืคื™ืกื•ืช ืงื•ื“ (ืื•ืœื™ ืœื ืฉืœืžื•ืช) ื›ื“ื™ ืœืฉืคืจ ืืช ื”ื”ื‘ื ื” ืฉืœืš. ื”ืงื•ื“ ื”ืžืœื ื™ื”ื™ื” ื‘ืกื•ืฃ ื”ืžืืžืจ.

ื”ืขืฅ ืžื•ืจื›ื‘ ืžืฆืžืชื™ื. ืžื‘ื ื” ื”ืฆื•ืžืช:

public class Node<T> {
    private T data;
    private int key;
    private Node<T> leftChild;
    private Node<T> rightChild;

    public Node(T data, int key) {
        this.data = data;
        this.key = key;
    }
    public Node<T> getLeftChild() {
        return leftChild;
    }

    public Node<T> getRightChild() {
        return rightChild;
    }
//...ะพัั‚ะฐะปัŒะฝั‹ะต ะผะตั‚ะพะดั‹ ัƒะทะปะฐ
}

ืœื›ืœ ืฆื•ืžืช ื™ืฉ ืฉื ื™ ื™ืœื“ื™ื (ื™ื™ืชื›ืŸ ื‘ื”ื—ืœื˜ ืฉื”ื™ืœื“ื™ื leftChild ื•/ืื• rightChild ื™ื”ื™ื• null). ื‘ื˜ื— ื”ื‘ื ืชื ืฉื‘ืžืงืจื” ื”ื–ื” ื ืชื•ื ื™ ื”ืžืกืคืจ ื”ื ื”ื ืชื•ื ื™ื ื”ืžืื•ื—ืกื ื™ื ื‘ืฆื•ืžืช; ืžืคืชื— - ืžืคืชื— ืฆื•ืžืช.

ื”ื‘ื ื• ืืช ื”ืงืฉืจ, ืขื›ืฉื™ื• ื‘ื•ืื• ื ื“ื‘ืจ ืขืœ ื”ื‘ืขื™ื•ืช ื”ื“ื•ื—ืงื•ืช ืœื’ื‘ื™ ืขืฆื™ื. ืœื”ืœืŸ, ืžืฉืžืขื•ืช ื”ืžื™ืœื” "ืขืฅ" ื”ื™ื ื”ืžื•ืฉื’ ืฉืœ ืขืฅ ื—ื™ืคื•ืฉ ื‘ื™ื ืืจื™. ืžื‘ื ื” ืขืฅ ื‘ื™ื ืืจื™:

public class BinaryTree<T> {
     private Node<T> root;

    //ะผะตั‚ะพะดั‹ ะดะตั€ะตะฒะฐ
}

ื‘ืชื•ืจ ืฉื“ื” ืžื—ืœืงื”, ืื ื—ื ื• ืฆืจื™ื›ื™ื ืจืง ืืช ื”ืฉื•ืจืฉ ืฉืœ ื”ืขืฅ, ื›ื™ ืžื”ืฉื•ืจืฉ, ื‘ืืžืฆืขื•ืช ื”ืžืชื•ื“ื•ืช getLeftChild() ื•-getRightChild(), ืืชื” ื™ื›ื•ืœ ืœื”ื’ื™ืข ืœื›ืœ ืฆื•ืžืช ืฉืœ ื”ืขืฅ.

ืืœื’ื•ืจื™ืชืžื™ื ืฉืœ ืขืฆื™ื

ื—ื™ืคื•ืฉ

ื ื ื™ื— ืฉื™ืฉ ืœืš ืขืฅ ื‘ื ื•ื™. ืื™ืš ืœืžืฆื•ื ืืœืžื ื˜ ืขื ืžืคืชื— ืžืคืชื—? ืืชื” ืฆืจื™ืš ืœืขื‘ื•ืจ ื‘ืจืฆืฃ ืžื”ืฉื•ืจืฉ ื‘ืžื•ืจื“ ื”ืขืฅ ื•ืœื”ืฉื•ื•ืช ืืช ื”ืขืจืš ืฉืœ ื”ืžืคืชื— ืขื ื”ืžืคืชื— ืฉืœ ื”ืฆื•ืžืช ื”ื‘ื: ืื ื”ืžืคืชื— ืงื˜ืŸ ืžื”ืžืคืชื— ืฉืœ ื”ืฆื•ืžืช ื”ื‘ื, ืขื‘ื•ืจ ืืœ ื”ืฆืืฆื ื”ืฉืžืืœื™ ืฉืœ ื”ืฆื•ืžืช, ืื ื™ื•ืชืจ - ืžื™ืžื™ืŸ, ืื ื”ืžืคืชื—ื•ืช ืฉื•ื•ื™ื - ื ืžืฆื ื”ืฆื•ืžืช ื”ืจืฆื•ื™! ืงื•ื“ ืจืœื•ื•ื ื˜ื™:

public Node<T> find(int key) {
    Node<T> current = root;
    while (current.getKey() != key) {
        if (key < current.getKey())
            current = current.getLeftChild();
        else
            current = current.getRightChild();
        if (current == null)
            return null;
    }
    return current;
}

ืื ื”ื–ืจื ื”ื•ืคืš ืœื‘ื˜ืœ, ืื– ื”ืื™ื˜ืจืฆื™ื” ื”ื’ื™ืขื” ืœืงืฆื” ื”ืขืฅ (ื‘ืจืžื” ืจืขื™ื•ื ื™ืช, ืืชื” ื ืžืฆื ื‘ืžืงื•ื ืœื ืงื™ื™ื ื‘ืขืฅ - ื™ืœื“ ืฉืœ ืขืœื”).

ืฉืงื•ืœ ืืช ื”ื™ืขื™ืœื•ืช ืฉืœ ืืœื’ื•ืจื™ืชื ื”ื—ื™ืคื•ืฉ ืขืœ ืขืฅ ืžืื•ื–ืŸ (ืขืฅ ืฉื‘ื• ืฆืžืชื™ื ืžืคื•ื–ืจื™ื ืคื—ื•ืช ืื• ื™ื•ืชืจ ื‘ืื•ืคืŸ ืฉื•ื•ื”). ืื– ื™ืขื™ืœื•ืช ื”ื—ื™ืคื•ืฉ ืชื”ื™ื” O(log(n)), ื•ื”ืœื•ื’ืจื™ืชื ื‘ืกื™ืก 2. ืจืื”: ืื ื™ืฉ n ืืœืžื ื˜ื™ื ื‘ืขืฅ ืžืื•ื–ืŸ, ืื– ื–ื” ืื•ืžืจ ืฉื™ื”ื™ื• ืจืžื•ืช log(n) ื‘ืกื™ืก 2 ืฉืœ ื”ืขืฅ. ื•ื‘ื—ื™ืคื•ืฉ, ืื—ืจื™ ืฉืœื‘ ืื—ื“ ื‘ืžื—ื–ื•ืจ, ืืชื” ื™ื•ืจื“ ืจืžื” ืื—ืช.

ื”ื›ื ืก

ืื ื”ื‘ื ืช ืืช ืžื”ื•ืช ื”ื—ื™ืคื•ืฉ, ืื– ืœื ื™ื”ื™ื” ืœืš ืงืฉื” ืœื”ื‘ื™ืŸ ืืช ื”ื”ื›ื ืกื”. ืืชื” ืจืง ืฆืจื™ืš ืœืจื“ืช ืœืขืœื” ืฉืœ ื”ืขืฅ (ืœืคื™ ื›ืœืœื™ ื”ื™ืจื™ื“ื” ื”ืžืชื•ืืจื™ื ื‘ื—ื™ืคื•ืฉ) ื•ืœื”ืคื•ืš ืœืฆืืฆืื™ ืฉืœื• - ืฉืžืืœื” ืื• ื™ืžื™ื ื”, ืชืœื•ื™ ื‘ืžืคืชื—. ื™ื™ืฉื•ื:

   public void insert(T insertData, int key) {
        Node<T> current = root;
        Node<T> parent;
        Node<T> newNode = new Node<>(insertData, key);
        if (root == null)
            root = newNode;
        else {
            while (true) {
                parent = current;
                if (key < current.getKey()) {
                    current = current.getLeftChild();
                    if (current == null) {
                         parent.setLeftChild(newNode);
                         return;
                    }
                }
                else {
                    current = current.getRightChild();
                    if (current == null) {
                        parent.setRightChild(newNode);
                        return;
                    }
                }
            }
        }
    }

ื‘ืžืงืจื” ื–ื”, ื‘ื ื•ืกืฃ ืœืฆื•ืžืช ื”ื ื•ื›ื—ื™, ื™ืฉ ืฆื•ืจืš ืœืื—ืกืŸ ืžื™ื“ืข ืขืœ ื”ืื‘ ืฉืœ ื”ืฆื•ืžืช ื”ื ื•ื›ื—ื™. ื›ืืฉืจ ื”ื ื•ื›ื—ื™ ื”ื•ืคืš ืœ-null, ืžืฉืชื ื” ื”ืื‘ ื™ื›ื™ืœ ืืช ื”ื’ื™ืœื™ื•ืŸ ืฉืื ื• ืฆืจื™ื›ื™ื.
ื‘ืจื•ืจ ืฉื™ืขื™ืœื•ืช ื”ื”ื—ื“ืจื” ืชื”ื™ื” ื–ื”ื” ืœื–ื• ืฉืœ ื”ื—ื™ืคื•ืฉ - O(log(n)).

ืžื—ื™ืงื”

ืžื—ื™ืงื” ื”ื™ื ื”ืคืขื•ืœื” ื”ืžื•ืจื›ื‘ืช ื‘ื™ื•ืชืจ ืฉืชืฆื˜ืจืš ืœื”ื™ืขืฉื•ืช ืขื ืขืฅ. ื‘ืจื•ืจ ืฉืชื—ื™ืœื” ื™ื”ื™ื” ืฆื•ืจืš ืœืžืฆื•ื ืืช ื”ืืœืžื ื˜ ืฉืื ื• ื”ื•ืœื›ื™ื ืœื”ืกื™ืจ. ืื‘ืœ ืื– ืžื”? ืื ืคืฉื•ื˜ ื ื’ื“ื™ืจ ืืช ื”ื”ืชื™ื™ื—ืกื•ืช ืฉืœื• ืœ- null, ืื– ื ืื‘ื“ ืžื™ื“ืข ืขืœ ืชืช-ื”ืขืฅ ืฉื”ืฉื•ืจืฉ ืฉืœื• ื”ื•ื ื”ืฆื•ืžืช ื”ื–ื”. ืฉื™ื˜ื•ืช ื”ืกืจืช ืขืฆื™ื ืžื—ื•ืœืงื•ืช ืœืฉืœื•ืฉื” ืžืงืจื™ื.

ืžืงืจื” ืจืืฉื•ืŸ. ืœืฆื•ืžืช ืฉื™ืฉ ืœื”ืกื™ืจ ืื™ืŸ ื™ืœื“ื™ื.

ืื ืœืฆื•ืžืช ืฉื™ื™ืžื—ืง ืื™ืŸ ื™ืœื“ื™ื, ื–ื” ืื•ืžืจ ืฉื–ื”ื• ืขืœื”. ืœื›ืŸ, ืืชื” ื™ื›ื•ืœ ืคืฉื•ื˜ ืœื”ื’ื“ื™ืจ ืืช ื”ืฉื“ื•ืช leftChild ืื• rightChild ืฉืœ ื”ืื‘ ืฉืœื• ืœ-null.

ืžืงืจื” ืฉื ื™. ืœืฆื•ืžืช ืฉื™ืฉ ืœื”ืกื™ืจ ื™ืฉ ื™ืœื“ ืื—ื“

ื’ื ื”ืžืงืจื” ื”ื–ื” ืœื ืงืฉื” ื‘ืžื™ื•ื—ื“. ื ื—ื–ื•ืจ ืœื“ื•ื’ืžื” ืฉืœื ื•. ื ื ื™ื— ืฉืขืœื™ื ื• ืœืžื—ื•ืง ืืœืžื ื˜ ืขื ืžืคืชื— 14. ืžืกื›ื™ื ืฉืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ื”ื™ืœื“ ื”ื™ืžื ื™ ืฉืœ ืฆื•ืžืช ืขื ืžืคืชื— 10, ืื– ืœื›ืœ ืื—ื“ ืžื”ืฆืืฆืื™ื ืฉืœื• (ื‘ืžืงืจื” ื–ื”, ื”ื™ืžื ื™) ื™ื”ื™ื” ืžืคืชื— ื’ื“ื•ืœ ืž-10, ืื– ืืชื” ื™ื›ื•ืœ ื‘ืงืœื•ืช "ืœื—ืชื•ืš" ืื•ืชื• ืžื”ืขืฅ, ื•ืœื—ื‘ืจ ืืช ื”ื”ื•ืจื” ื™ืฉื™ืจื•ืช ืœื™ืœื“ ืฉืœ ื”ืฆื•ืžืช ืฉื ืžื—ืง, ื›ืœื•ืžืจ. ืœื—ื‘ืจ ืืช ื”ืฆื•ืžืช ืขื ืžืงืฉ 10 ืœืฆื•ืžืช 13. ื”ืžืฆื‘ ื”ื™ื” ื“ื•ืžื” ืื ื ืฆื˜ืจืš ืœืžื—ื•ืง ืฆื•ืžืช ืฉื”ื•ื ื”ื™ืœื“ ื”ืฉืžืืœื™ ืฉืœ ื”ื”ื•ืจื” ืฉืœื•. ืชื—ืฉื•ื‘ ืขืœ ื–ื” ื‘ืขืฆืžืš - ืื ืœื•ื’ื™ื” ืžื“ื•ื™ืงืช.

ืžืงืจื” ืฉืœื™ืฉื™. ืœ-Node ื™ืฉ ืฉื ื™ ื™ืœื“ื™ื

ื”ืžืงืจื” ื”ื›ื™ ืงืฉื”. ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื“ื•ื’ืžื” ื—ื“ืฉื”.

ืขืฅ ื‘ื™ื ืืจื™ ืื• ื›ื™ืฆื“ ืœื”ื›ื™ืŸ ืขืฅ ื—ื™ืคื•ืฉ ื‘ื™ื ืืจื™

ื—ืคืฉ ื™ื•ืจืฉ

ื ื ื™ื— ืฉืฆืจื™ืš ืœื”ืกื™ืจ ืืช ื”ืฆื•ืžืช ืขื ืžืคืชื— 25. ืืช ืžื™ ื ื›ื ื™ืก ื‘ืžืงื•ืžื•? ืื—ื“ ืžื—ืกื™ื“ื™ื• (ืฆืืฆืื™ื ืื• ืฆืืฆืื™ื ืฉืœ ืฆืืฆืื™ื) ื—ื™ื™ื‘ ืœื”ื™ื•ืช ื™ื•ึนืจึตืฉื(ื–ื” ืฉื™ืชืคื•ืก ืืช ืžืงื•ืžื• ืฉืœ ื”ืฆื•ืžืช ืฉื”ื•ืกืจ).

ืื™ืš ื™ื•ื“ืขื™ื ืžื™ ืฆืจื™ืš ืœื”ื™ื•ืช ื”ื™ื•ืจืฉ? ื‘ืื•ืคืŸ ืื™ื ื˜ื•ืื™ื˜ื™ื‘ื™, ื–ื”ื• ื”ืฆื•ืžืช ื‘ืขืฅ ืฉื”ืžืคืชื— ืฉืœื• ื”ื•ื ื”ื‘ื ื‘ื’ื•ื“ืœื• ืžื”ืฆื•ืžืช ืฉื”ื•ืกืจ. ื”ืืœื’ื•ืจื™ืชื ื”ื•ื ื›ื“ืœืงืžืŸ. ืืชื” ืฆืจื™ืš ืœืœื›ืช ืœื™ืœื“ ื”ื™ืžื ื™ ืฉืœื• (ืชืžื™ื“ ืœื™ืžื™ืŸ, ื›ื™ ื›ื‘ืจ ื ืืžืจ ืฉื”ืžืคืชื— ืฉืœ ื”ื™ื•ืจืฉ ื’ื“ื•ืœ ืžื”ืžืคืชื— ืฉืœ ื”ืฆื•ืžืช ืฉื ืžื—ืง), ื•ืื– ืœืขื‘ื•ืจ ืืช ืฉืจืฉืจืช ื”ื™ืœื“ื™ื ื”ืฉืžืืœื™ ืฉืœ ื”ื™ืžื™ืŸ ื”ื–ื” ื™ึถืœึถื“. ื‘ื“ื•ื’ืžื”, ืขืœื™ื ื• ืœืœื›ืช ืœืฆื•ืžืช ืขื ืžืงืฉ 35, ื•ืœืื—ืจ ืžื›ืŸ ืœืจื“ืช ื‘ืฉืจืฉืจืช ืฉืœ ื™ืœื“ื™ื• ื”ืฉืžืืœื™ื™ื ืœืขืœื” - ื‘ืžืงืจื” ื–ื”, ื”ืฉืจืฉืจืช ื”ื–ื• ืžื•ืจื›ื‘ืช ืจืง ืžื”ืฆื•ืžืช ืขื ืžืคืชื— 30. ืœืžื”ื“ืจื™ืŸ, ืื ื• ืžื—ืคืฉื™ื ื”ืฆื•ืžืช ื”ืงื˜ืŸ ื‘ื™ื•ืชืจ ื‘ืงื‘ื•ืฆืช ื”ืฆืžืชื™ื ื”ื’ื“ื•ืœ ืžื”ืฆื•ืžืช ื”ืจืฆื•ื™.

ืขืฅ ื‘ื™ื ืืจื™ ืื• ื›ื™ืฆื“ ืœื”ื›ื™ืŸ ืขืฅ ื—ื™ืคื•ืฉ ื‘ื™ื ืืจื™

ืงื•ื“ ืฉื™ื˜ืช ื—ื™ืคื•ืฉ ื™ื•ืจืฉ:

    public Node<T> getSuccessor(Node<T> deleteNode) {
        Node<T> parentSuccessor = deleteNode;//ั€ะพะดะธั‚ะตะปัŒ ะฟั€ะตะตะผะฝะธะบะฐ
        Node<T> successor = deleteNode;//ะฟั€ะตะตะผะฝะธะบ
        Node<T> current = successor.getRightChild();//ะฟั€ะพัั‚ะพ "ะฟั€ะพะฑะตะณะฐัŽั‰ะธะน" ัƒะทะตะป
        while (current != null) {
            parentSuccessor = successor;
            successor = current;
            current = current.getLeftChild();
        }
        //ะฝะฐ ะฒั‹ั…ะพะดะต ะธะท ั†ะธะบะปะฐ ะธะผะตะตะผ ะฟั€ะตะตะผะฝะธะบะฐ ะธ ั€ะพะดะธั‚ะตะปั ะฟั€ะตะตะผะฝะธะบะฐ
        if (successor != deleteNode.getRightChild()) {//ะตัะปะธ ะฟั€ะตะตะผะฝะธะบ ะฝะต ัะพะฒะฟะฐะดะฐะตั‚ ั ะฟั€ะฐะฒั‹ะผ ะฟะพั‚ะพะผะบะพะผ ัƒะดะฐะปัะตะผะพะณะพ ัƒะทะปะฐ
            parentSuccessor.setLeftChild(successor.getRightChild());//ั‚ะพ ะตะณะพ ั€ะพะดะธั‚ะตะปัŒ ะทะฐะฑะธั€ะฐะตั‚ ัะตะฑะต ะฟะพั‚ะพะผะบะฐ ะฟั€ะตะตะผะฝะธะบะฐ, ั‡ั‚ะพะฑั‹ ะฝะต ะฟะพั‚ะตั€ัั‚ัŒ ะตะณะพ
            successor.setRightChild(deleteNode.getRightChild());//ัะฒัะทั‹ะฒะฐะตะผ ะฟั€ะตะตะผะฝะธะบะฐ ั ะฟั€ะฐะฒั‹ะผ ะฟะพั‚ะพะผะบะพะผ ัƒะดะฐะปัะตะผะพะณะพ ัƒะทะปะฐ
        }
        return successor;
    }

ื”ืงื•ื“ ื”ืžืœื ืฉืœ ืฉื™ื˜ืช ื”ืžื—ื™ืงื”:

public boolean delete(int deleteKey) {
        Node<T> current = root;
        Node<T> parent = current;
        boolean isLeftChild = false;//ะ’ ะทะฐะฒะธัะธะผะพัั‚ะธ ะพั‚ ั‚ะพะณะพ, ัะฒะปัะตั‚ัั ะปะธ  ัƒะดะฐะปัะตะผั‹ะน ัƒะทะตะป ะปะตะฒั‹ะผ ะธะปะธ ะฟั€ะฐะฒั‹ะผ ะฟะพั‚ะพะผะบะพะผ ัะฒะพะตะณะพ ั€ะพะดะธั‚ะตะปั, ะฑัƒะปะตะฒัะบะฐั ะฟะตั€ะตะผะตะฝะฝะฐั isLeftChild ะฑัƒะดะตั‚ ะฟั€ะธะฝะธะผะฐั‚ัŒ ะทะฝะฐั‡ะตะฝะธะต true ะธะปะธ false ัะพะพั‚ะฒะตั‚ัั‚ะฒะตะฝะฝะพ.
        while (current.getKey() != deleteKey) {
            parent = current;
            if (deleteKey < current.getKey()) {
                current = current.getLeftChild();
                isLeftChild = true;
            } else {
                isLeftChild = false;
                current = current.getRightChild();
            }
            if (current == null)
                return false;
        }

        if (current.getLeftChild() == null && current.getRightChild() == null) {//ะฟะตั€ะฒั‹ะน ัะปัƒั‡ะฐะน
            if (current == root)
                current = null;
            else if (isLeftChild)
                parent.setLeftChild(null);
            else
                parent.setRightChild(null);
        }
        else if (current.getRightChild() == null) {//ะฒั‚ะพั€ะพะน ัะปัƒั‡ะฐะน
            if (current == root)
                root = current.getLeftChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getLeftChild());
            else
                current.setRightChild(current.getLeftChild());
        } else if (current.getLeftChild() == null) {
            if (current == root)
                root = current.getRightChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getRightChild());
            else
                parent.setRightChild(current.getRightChild());
        } 
        else {//ั‚ั€ะตั‚ะธะน ัะปัƒั‡ะฐะน
            Node<T> successor = getSuccessor(current);
            if (current == root)
                root = successor;
            else if (isLeftChild)
                parent.setLeftChild(successor);
            else
                parent.setRightChild(successor);
        }
        return true;
    }

ื ื™ืชืŸ ืœื”ืขืจื™ืš ืืช ื”ืžื•ืจื›ื‘ื•ืช ืœ-O(log(n)).

ืžืฆื™ืืช ื”ืžืงืกื™ืžื•ื/ืžื™ื ื™ืžื•ื ื‘ืขืฅ

ื‘ืจื•ืจ, ืื™ืš ืœืžืฆื•ื ืืช ื”ืขืจืš ื”ืžื™ื ื™ืžืœื™ / ื”ืžืงืกื™ืžืœื™ ื‘ืขืฅ - ืืชื” ืฆืจื™ืš ืœืขื‘ื•ืจ ื‘ืจืฆืฃ ืืช ืฉืจืฉืจืช ื”ืืœืžื ื˜ื™ื ื”ืฉืžืืœื™ / ื™ืžื™ืŸ ืฉืœ ื”ืขืฅ, ื‘ื”ืชืืžื”; ื›ืฉืชื’ื™ืขื• ืœืขืœื”, ื–ื” ื™ื”ื™ื” ื”ืืœืžื ื˜ ื”ืžื™ื ื™ืžืœื™/ืžืงืกื™ืžืœื™.

    public Node<T> getMinimum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getLeftChild();
        }
        return parent;
    }

    public Node<T> getMaximum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getRightChild();
        }
        return parent;
    }

ืžื•ืจื›ื‘ื•ืช - O(log(n))

ืžืขืงืฃ ืกื™ืžื˜ืจื™

ื—ืฆื™ื” ื”ื™ื ื‘ื™ืงื•ืจ ื‘ื›ืœ ืฆื•ืžืช ืฉืœ ื”ืขืฅ ื›ื“ื™ ืœืขืฉื•ืช ืื™ืชื• ืžืฉื”ื•.

ืืœื’ื•ืจื™ืชื ืžืขื‘ืจ ืกื™ืžื˜ืจื™ ืจืงื•ืจืกื™ื‘ื™:

  1. ื‘ืฆืข ืคืขื•ืœื” ืขืœ ื”ื™ืœื“ ื”ืฉืžืืœื™
  2. ืขืฉื” ืคืขื•ืœื” ืขื ืขืฆืžืš
  3. ื‘ืฆืข ืคืขื•ืœื” ืขืœ ื”ื™ืœื“ ื”ื ื›ื•ืŸ

ืงื•ื“:

    public void inOrder(Node<T> current) {
        if (current != null) {
            inOrder(current.getLeftChild());
            System.out.println(current.getData() + " ");//ะ—ะดะตััŒ ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะฒัะต, ั‡ั‚ะพ ัƒะณะพะดะฝะพ
            inOrder(current.getRightChild());
        }
    }

ืžืกืงื ื”

ืกื•ืฃ ื›ืœ ืกื•ืฃ! ืื ืœื ื”ืกื‘ืจืชื™ ืžืฉื”ื• ืื• ืฉื™ืฉ ืœื™ ื”ืขืจื•ืช, ืื– ืื ื™ ืžื—ื›ื” ื‘ืชื’ื•ื‘ื•ืช. ื›ืคื™ ืฉื”ื•ื‘ื˜ื—, ื”ื ื” ื”ืงื•ื“ ื”ืžืœื.

Node.java:

public class Node<T> {
    private T data;
    private int key;
    private Node<T> leftChild;
    private Node<T> rightChild;

    public Node(T data, int key) {
        this.data = data;
        this.key = key;
    }

    public void setLeftChild(Node<T> newNode) {
        leftChild = newNode;
    }

    public void setRightChild(Node<T> newNode) {
        rightChild = newNode;
    }

    public Node<T> getLeftChild() {
        return leftChild;
    }

    public Node<T> getRightChild() {
        return rightChild;
    }

    public T getData() {
        return data;
    }

    public int getKey() {
        return key;
    }
}

BinaryTree.java:

public class BinaryTree<T> {
    private Node<T> root;

    public Node<T> find(int key) {
        Node<T> current = root;
        while (current.getKey() != key) {
            if (key < current.getKey())
                current = current.getLeftChild();
            else
                current = current.getRightChild();
            if (current == null)
                return null;
        }
        return current;
    }

    public void insert(T insertData, int key) {
        Node<T> current = root;
        Node<T> parent;
        Node<T> newNode = new Node<>(insertData, key);
        if (root == null)
            root = newNode;
        else {
            while (true) {
                parent = current;
                if (key < current.getKey()) {
                    current = current.getLeftChild();
                    if (current == null) {
                         parent.setLeftChild(newNode);
                         return;
                    }
                }
                else {
                    current = current.getRightChild();
                    if (current == null) {
                        parent.setRightChild(newNode);
                        return;
                    }
                }
            }
        }
    }

    public Node<T> getMinimum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getLeftChild();
        }
        return parent;
    }

    public Node<T> getMaximum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getRightChild();
        }
        return parent;
    }

    public Node<T> getSuccessor(Node<T> deleteNode) {
        Node<T> parentSuccessor = deleteNode;
        Node<T> successor = deleteNode;
        Node<T> current = successor.getRightChild();
        while (current != null) {
            parentSuccessor = successor;
            successor = current;
            current = current.getLeftChild();
        }

        if (successor != deleteNode.getRightChild()) {
            parentSuccessor.setLeftChild(successor.getRightChild());
            successor.setRightChild(deleteNode.getRightChild());
        }
        return successor;
    }

    public boolean delete(int deleteKey) {
        Node<T> current = root;
        Node<T> parent = current;
        boolean isLeftChild = false;
        while (current.getKey() != deleteKey) {
            parent = current;
            if (deleteKey < current.getKey()) {
                current = current.getLeftChild();
                isLeftChild = true;
            } else {
                isLeftChild = false;
                current = current.getRightChild();
            }
            if (current == null)
                return false;
        }

        if (current.getLeftChild() == null && current.getRightChild() == null) {
            if (current == root)
                current = null;
            else if (isLeftChild)
                parent.setLeftChild(null);
            else
                parent.setRightChild(null);
        }
        else if (current.getRightChild() == null) {
            if (current == root)
                root = current.getLeftChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getLeftChild());
            else
                current.setRightChild(current.getLeftChild());
        } else if (current.getLeftChild() == null) {
            if (current == root)
                root = current.getRightChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getRightChild());
            else
                parent.setRightChild(current.getRightChild());
        } 
        else {
            Node<T> successor = getSuccessor(current);
            if (current == root)
                root = successor;
            else if (isLeftChild)
                parent.setLeftChild(successor);
            else
                parent.setRightChild(successor);
        }
        return true;
    }

    public void inOrder(Node<T> current) {
        if (current != null) {
            inOrder(current.getLeftChild());
            System.out.println(current.getData() + " ");
            inOrder(current.getRightChild());
        }
    }
}

ื .ื‘.

ื ื™ื•ื•ืŸ ืœ-O(n)

ืจื‘ื™ื ืžื›ื ืื•ืœื™ ืฉืžื• ืœื‘: ืžื” ืื ืชื’ืจืžื• ืœืขืฅ ืœื”ื™ื•ืช ืœื ืžืื•ื–ืŸ? ืœื“ื•ื’ืžื”, ืฉื™ื ืฆืžืชื™ื ื‘ืขืฅ ืขื ืžืคืชื—ื•ืช ื”ื•ืœื›ื™ื ื•ื’ื“ืœื™ื: 1,2,3,4,5,6... ื•ืื– ื”ืขืฅ ื™ื–ื›ื™ืจ ืงืฆืช ืจืฉื™ืžื” ืžืงื•ืฉืจืช. ื•ื›ืŸ, ื”ืขืฅ ื™ืื‘ื“ ืืช ืžื‘ื ื” ื”ืขืฅ ืฉืœื•, ื•ืžื›ืืŸ ืืช ื™ืขื™ืœื•ืช ื”ื’ื™ืฉื” ืœื ืชื•ื ื™ื. ื”ืžื•ืจื›ื‘ื•ืช ืฉืœ ืคืขื•ืœื•ืช ื—ื™ืคื•ืฉ, ื”ื›ื ืกื” ื•ืžื—ื™ืงื” ืชื”ืคื•ืš ืœื”ื™ื•ืช ื–ื”ื” ืœื–ื• ืฉืœ ืจืฉื™ืžื” ืžืงื•ืฉืจืช: O(n). ื–ื”ื• ืื—ื“ ื”ื—ืกืจื•ื ื•ืช ื”ื—ืฉื•ื‘ื™ื ื‘ื™ื•ืชืจ, ืœื“ืขืชื™, ืฉืœ ืขืฆื™ื ื‘ื™ื ืืจื™ื™ื.

ืจืง ืžืฉืชืžืฉื™ื ืจืฉื•ืžื™ื ื™ื›ื•ืœื™ื ืœื”ืฉืชืชืฃ ื‘ืกืงืจ. ืœื”ืชื—ื‘ืจื‘ื‘ืงืฉื”.

ืœื ื”ื™ื™ืชื™ ื‘-Habrรฉ ื“ื™ ื”ืจื‘ื” ื–ืžืŸ, ื•ื”ื™ื™ืชื™ ืจื•ืฆื” ืœื“ืขืช ืื™ืœื• ืžืืžืจื™ื ื‘ืื™ืœื• ื ื•ืฉืื™ื ื”ื™ื™ืช ืจื•ืฆื” ืœืจืื•ืช ื™ื•ืชืจ?

  • ืžื‘ื ื™ ืžื™ื“ืข

  • ืืœื’ื•ืจื™ืชืžื™ื (DP, ืจืงื•ืจืกื™ื”, ื“ื—ื™ืกืช ื ืชื•ื ื™ื ื•ื›ื•')

  • ื™ื™ืฉื•ื ืžื‘ื ื™ ื ืชื•ื ื™ื ื•ืืœื’ื•ืจื™ืชืžื™ื ื‘ื—ื™ื™ื ื”ืืžื™ืชื™ื™ื

  • ืชื›ื ื•ืช ืืคืœื™ืงืฆื™ื•ืช ืื ื“ืจื•ืื™ื“ ื‘-Java

  • ืชื›ื ื•ืช ื™ื™ืฉื•ืžื™ ืื™ื ื˜ืจื ื˜ Java

2 ืžืฉืชืžืฉื™ื ื”ืฆื‘ื™ืขื•. 1 ืžืฉืชืžืฉื™ื ื ืžื ืขื•.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”