Binary Tree ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска

ΠŸΡ€Π΅Π»ΡŽΠ΄ΠΈΡ

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ посвящСна Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌ поиска. НСдавно Π΄Π΅Π»Π°Π» ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΏΡ€ΠΎ сТатиС Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π°. Π’Π°ΠΌ я Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π°Π» Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Π΄Π΅Ρ€Π΅Π²ΡŒΡ, ΠΈΠ±ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ поиска, вставки, удалСния Π½Π΅ Π±Ρ‹Π»ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π΅ΡˆΠΈΠ» Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎ Π΄Π΅Ρ€Π΅Π²ΡŒΡ. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉ, Π½Π°Ρ‡Π½Π΅ΠΌ.

Π”Π΅Ρ€Π΅Π²ΠΎ β€” структура Π΄Π°Π½Π½Ρ‹Ρ…, состоящая ΠΈΠ· ΡƒΠ·Π»ΠΎΠ², соСдинСнных Ρ€Π΅Π±Ρ€Π°ΠΌΠΈ. МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π΅Ρ€Π΅Π²ΠΎ β€” частный случай Π³Ρ€Π°Ρ„Π°. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π΅Ρ€Π΅Π²Π°:

Binary Tree ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска

Π­Ρ‚ΠΎ Π½Π΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска! ВсС ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚!

ВСрминология

ΠšΠΎΡ€Π΅Π½ΡŒ

ΠšΠΎΡ€Π΅Π½ΡŒ Π΄Π΅Ρ€Π΅Π²Π° β€” это самый Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ Π΅Π³ΠΎ ΡƒΠ·Π΅Π». Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” это ΡƒΠ·Π΅Π» A. Π’ Π΄Π΅Ρ€Π΅Π²Π΅ ΠΎΡ‚ корня ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΡƒΠ·Π»Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ вСсти Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡƒΡ‚ΡŒ! На самом Π΄Π΅Π»Π΅, любой ΡƒΠ·Π΅Π» ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΊΠΎΡ€Π΅Π½ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ этому ΡƒΠ·Π»Ρƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π°.

Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ/ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΈ

ВсС ΡƒΠ·Π»Ρ‹, ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ, ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎ Ρ€Π΅Π±Ρ€ΠΎ, Π²Π΅Π΄ΡƒΡ‰Π΅Π΅ Π²Π²Π΅Ρ€Ρ… ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΡƒΠ·Π»Ρƒ. Π£Π·Π΅Π», располоТСнный Π²Ρ‹ΡˆΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ, называСтся Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ этого ΡƒΠ·Π»Π°. Π£Π·Π΅Π», располоТСнный Π½ΠΈΠΆΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ, ΠΈ соСдинСнный с Π½ΠΈΠΌ называСтся ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ этого ΡƒΠ·Π»Π°. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ ΡƒΠ·Π΅Π» B, Ρ‚ΠΎΠ³Π΄Π° Π΅Π³ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ·Π΅Π» A, Π° ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ β€” ΡƒΠ·Π»Ρ‹ D, E ΠΈ F.

Лист

Π£Π·Π΅Π», Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ листом Π΄Π΅Ρ€Π΅Π²Π°. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π»ΠΈΡΡ‚ΡŒΡΠΌΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ ΡƒΠ·Π»Ρ‹ D, E, F, G, I, J, K.

Π­Ρ‚ΠΎ основная тСрминология. Π”Ρ€ΡƒΠ³ΠΈΠ΅ понятия Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½Ρ‹ Π΄Π°Π»Π΅Π΅. Π˜Ρ‚Π°ΠΊ, Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ β€” Π΄Π΅Ρ€Π΅Π²ΠΎ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ². Как Π²Ρ‹ догадались, Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ, ΠΈΠ±ΠΎ ΡƒΠ·Π»Ρ‹ B ΠΈ H ΠΈΠΌΠ΅ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ². Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°:

Binary Tree ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска

Π’ ΡƒΠ·Π»Π°Ρ… Π΄Π΅Ρ€Π΅Π²Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ любая информация. Π”Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска β€” это Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ свойства:

  1. Оба ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° β€” Π»Π΅Π²ΠΎΠ΅ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ΅ β€” ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌΠΈ поиска.
  2. Π£ всСх ΡƒΠ·Π»ΠΎΠ² Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° X значСния ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ… мСньшС, Π½Π΅ΠΆΠ΅Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… самого ΡƒΠ·Π»Π° X.
  3. Π£ всСх ΡƒΠ·Π»ΠΎΠ² ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° X значСния ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ… большС Π»ΠΈΠ±ΠΎ Ρ€Π°Π²Π½Ρ‹, Π½Π΅ΠΆΠ΅Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… самого ΡƒΠ·Π»Π° X.

ΠšΠ»ΡŽΡ‡ β€” какая-Π»ΠΈΠ±ΠΎ характСристика ΡƒΠ·Π»Π°(Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, число). ΠšΠ»ΡŽΡ‡ Π½ΡƒΠΆΠ΅Π½ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΡ‚ΠΈ элСмСнт Π΄Π΅Ρ€Π΅Π²Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ соотвСтствуСт этот ΠΊΠ»ΡŽΡ‡. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° поиска:

Binary Tree ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π΅Ρ€Π΅Π²Π°

По ΠΌΠ΅Ρ€Π΅ продвиТСния я Π±ΡƒΠ΄Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅(Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ΠΏΠΎΠ»Π½Ρ‹Π΅) куски ΠΊΠΎΠ΄Π°, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ вашС ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅. ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π² ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Π”Π΅Ρ€Π΅Π²ΠΎ состоит ΠΈΠ· ΡƒΠ·Π»ΠΎΠ². Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΡƒΠ·Π»Π°:

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). Π’Ρ‹, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, поняли, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС число data β€” Π΄Π°Π½Π½Ρ‹Π΅, хранящиСся Π² ΡƒΠ·Π»Π΅; key β€” ΠΊΠ»ΡŽΡ‡ ΡƒΠ·Π»Π°.

Π‘ ΡƒΠ·Π»ΠΎΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… насущных ΠΎ Π΄Π΅Ρ€Π΅Π²ΡŒΡΡ…. Π—Π΄Π΅ΡΡŒ ΠΈ Π΄Π°Π»Π΅Π΅ ΠΏΠΎΠ΄ словом Β«Π΄Π΅Ρ€Π΅Π²ΠΎΒ» Π±ΡƒΠ΄Ρƒ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Ρ‚ΡŒ понятиС Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° поиска. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°:

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

    //ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π΄Π΅Ρ€Π΅Π²Π°
}

Как ΠΏΠΎΠ»Π΅ класса Π½Π°ΠΌ понадобится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄Π΅Ρ€Π΅Π²Π°, ΠΈΠ±ΠΎ ΠΎΡ‚ корня с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² getLeftChild() ΠΈ getRightChild() ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ любого ΡƒΠ·Π»Π° Π΄Π΅Ρ€Π΅Π²Π°.

Алгоритмы Π² Π΄Π΅Ρ€Π΅Π²Π΅

Поиск

Допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ построСнноС Π΄Π΅Ρ€Π΅Π²ΠΎ. Как Π½Π°ΠΉΡ‚ΠΈ элСмСнт с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ key? НуТно ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ корня Π²Π½ΠΈΠ· ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ key с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°: Ссли key мСньшС, Ρ‡Π΅ΠΌ ΠΊΠ»ΡŽΡ‡ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π»Π΅Π²ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΌΠΊΡƒ ΡƒΠ·Π»Π°, Ссли большС β€” ΠΊ ΠΏΡ€Π°Π²ΠΎΠΌΡƒ, Ссли ΠΊΠ»ΡŽΡ‡ΠΈ Ρ€Π°Π²Π½Ρ‹ β€” искомый ΡƒΠ·Π΅Π» Π½Π°ΠΉΠ΄Π΅Π½! Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

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;
}

Если current становится Ρ€Π°Π²Π½Ρ‹ΠΌ null, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ достиг ΠΊΠΎΠ½Ρ†Π° Π΄Π΅Ρ€Π΅Π²Π°(Π½Π° ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ Π² Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ мСстС Π΄Π΅Ρ€Π΅Π²Π° β€” ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅ листа).

Рассмотрим ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° поиска Π½Π° сбалансированном Π΄Π΅Ρ€Π΅Π²Π΅(Π΄Π΅Ρ€Π΅Π²Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡƒΠ·Π»Ρ‹ распрСдСлСны Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ). Π’ΠΎΠ³Π΄Π° ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ поиска Π±ΡƒΠ΄Π΅Ρ‚ 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;
                    }
                }
            }
        }
    }

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π°Π΄ΠΎ, ΠΏΠΎΠΌΠΈΠΌΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π°, Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π°. Когда current станСт Ρ€Π°Π²Π½Ρ‹ΠΌ null, Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ parent Π±ΡƒΠ΄Π΅Ρ‚ Π»Π΅ΠΆΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π½Π°ΠΌ лист.
Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ вставки, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Ρƒ поиска β€” O(log(n)).

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ β€” самая слоТная опСрация, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ провСсти с Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ. ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ сначала Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ собираСмся ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ. Но Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΌ? Если просто ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π΅Π³ΠΎ ссылкС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null, Ρ‚ΠΎ ΠΌΡ‹ потСрям ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π΅, ΠΊΠΎΡ€Π½Π΅ΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся этот ΡƒΠ·Π΅Π». ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ удалСния Π΄Π΅Ρ€Π΅Π²Π° Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ Π½Π° Ρ‚Ρ€ΠΈ случая.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ случай. УдаляСмый ΡƒΠ·Π΅Π» Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²

Если удаляСмый ΡƒΠ·Π΅Π» Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ являСтся листом. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ просто полям leftChild ΠΈΠ»ΠΈ rightChild Π΅Π³ΠΎ родитСля ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ случай. УдаляСмый ΡƒΠ·Π΅Π» ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°

Π­Ρ‚ΠΎΡ‚ случай Ρ‚ΠΎΠΆΠ΅ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ слоТный. ВСрнСмся ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ. Допустим, Π½Π°Π΄ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ элСмСнт с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ 14. Π‘ΠΎΠ³Π»Π°ΡΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ β€” ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΡƒΠ·Π»Π° с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ 10, Ρ‚ΠΎ любой Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ(Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡ€Π°Π²Ρ‹ΠΉ) Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡, больший 10, поэтому ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π΅Π³ΠΎ Β«Π²Ρ‹Ρ€Π΅Π·Π°Ρ‚ΡŒΒ» ΠΈΠ· Π΄Π΅Ρ€Π΅Π²Π°, Π° родитСля ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ удаляСмого ΡƒΠ·Π»Π°, Ρ‚.Π΅. ΡƒΠ·Π΅Π» с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ 10 ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ с ΡƒΠ·Π»ΠΎΠΌ 13. Аналогичной Π±Ρ‹Π»Π° Π±Ρ‹ ситуация, Ссли Π±Ρ‹ Π½Π°Π΄ΠΎ Π±Ρ‹Π»ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΡƒΠ·Π΅Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Π»Π΅Π²Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ своСго родитСля. ΠŸΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎΠ± этом сами β€” точная аналогия.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ случай. Π£Π·Π΅Π» ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²

НаиболСС слоТный случай. Π Π°Π·Π±Π΅Ρ€Π΅ΠΌ Π½Π° Π½ΠΎΠ²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Binary Tree ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска

Поиск ΠΏΡ€Π΅Π΅ΠΌΠ½ΠΈΠΊΠ°

Допустим, Π½Π°Π΄ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΡƒΠ·Π΅Π» с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ 25. Кого поставим Π½Π° Π΅Π³ΠΎ мСсто? ΠšΡ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ· Π΅Π³ΠΎ послСдоватСлСй(ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²) Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΅ΠΌΠ½ΠΈΠΊΠΎΠΌ(Ρ‚ΠΎΡ‚, ΠΊΡ‚ΠΎ Π·Π°ΠΉΠΌΠ΅Ρ‚ мСсто удаляСмого ΡƒΠ·Π»Π°).

Как ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΡ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΅ΠΌΠ½ΠΈΠΊΠΎΠΌ? Π˜Π½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятно, Ρ‡Ρ‚ΠΎ это ΡƒΠ·Π΅Π» Π² Π΄Π΅Ρ€Π΅Π²Π΅, ΠΊΠ»ΡŽΡ‡ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ β€” ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅ ΠΎΡ‚ удаляСмого ΡƒΠ·Π»Π°. Алгоритм Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ. Надо ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΌΠΊΡƒ(всСгда ΠΊ ΠΏΡ€Π°Π²ΠΎΠΌΡƒ, ΠΈΠ±ΠΎ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡ ΠΏΡ€Π΅Π΅ΠΌΠ½ΠΈΠΊΠ° большС ΠΊΠ»ΡŽΡ‡Π° удаляСмого ΡƒΠ·Π»Π°), Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ Π»Π΅Π²Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² этого ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡƒΠ·Π»Ρƒ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ 35, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠΉΡ‚ΠΈΡΡŒ Π΄ΠΎ листа Π²Π½ΠΈΠ· ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ Π΅Π³ΠΎ Π»Π΅Π²Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² β€” Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, эта Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° состоит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΡƒΠ·Π»Π° с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ 30. Π‘Ρ‚Ρ€ΠΎΠ³ΠΎ говоря, ΠΌΡ‹ ΠΈΡ‰Π΅ΠΌ наимСньший ΡƒΠ·Π΅Π» Π² Π½Π°Π±ΠΎΡ€Π΅ ΡƒΠ·Π»ΠΎΠ², Π±ΠΎΠ»ΡŒΡˆΠΈΡ… искомого ΡƒΠ·Π»Π°.

Binary Tree ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска

Код ΠΌΠ΅Ρ‚ΠΎΠ΄Π° поиска ΠΏΡ€Π΅Π΅ΠΌΠ½ΠΈΠΊΠ°:

    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;
    }

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° delete:

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());
        }
    }
}

P.S.

Π’Ρ‹Ρ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π΄ΠΎ O(n)

МногиС ΠΈΠ· вас ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ: Π° Ρ‡Ρ‚ΠΎ, Ссли ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅Ρ€Π΅Π²ΠΎ стало нСсбалансированным? НапримСр, ΠΊΠ»Π°ΡΡ‚ΡŒ Π² Π΄Π΅Ρ€Π΅Π²ΠΎ ΡƒΠ·Π»Ρ‹ с Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ: 1,2,3,4,5,6… Π’ΠΎΡ‚ Ρ‚ΠΎΠ³Π΄Π° Π΄Π΅Ρ€Π΅Π²ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ связный список. И Π΄Π°, Π΄Π΅Ρ€Π΅Π²ΠΎ потСряСт свою Π΄Ρ€Π΅Π²ΠΎΠ²ΠΈΠ΄Π½ΡƒΡŽ структуру, Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ поиска, вставки, удалСния станут Ρ‚Π°ΠΊΠΈΠΌΠΈ, ΠΊΠ°ΠΊ Ρƒ связного списка: O(n). Π’ этом ΠΈ проявляСтся ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ…, Π½Π° ΠΌΠΎΠΉ взгляд, нСдостатков Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π².

Волько зарСгистрированныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² опросС. Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅, поТалуйста.

Π― Π½Π΅ совсСм Π΄Π°Π²Π½ΠΎ Π½Π° Ρ…Π°Π±Ρ€Π΅, ΠΈ ΠΌΠ½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ Π·Π½Π°Ρ‚ΡŒ, ΡΡ‚Π°Ρ‚ΡŒΠΈ Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚Π΅ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ Π²Ρ‹ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ большС?

  • Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

  • Алгоритмы(Π”ΠŸ, рСкурсия, сТатиС Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ‚. Π΄.)

  • ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ структур Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ

  • ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ android-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Java

  • ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ web-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Java

ΠŸΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π»ΠΈ 2 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. ВоздСрТался 1 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com