ΠΡΠ΅Π»ΡΠ΄ΠΈΡ
ΠΡΠ° ΡΡΠ°ΡΡΡ ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π° Π±ΠΈΠ½Π°ΡΠ½ΡΠΌ Π΄Π΅ΡΠ΅Π²ΡΡΠΌ ΠΏΠΎΠΈΡΠΊΠ°. ΠΠ΅Π΄Π°Π²Π½ΠΎ Π΄Π΅Π»Π°Π» ΡΡΠ°ΡΡΡ ΠΏΡΠΎ
ΠΠ΅ΡΠ΅Π²ΠΎ β ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ , ΡΠΎΡΡΠΎΡΡΠ°Ρ ΠΈΠ· ΡΠ·Π»ΠΎΠ², ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΡ ΡΠ΅Π±ΡΠ°ΠΌΠΈ. ΠΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π΄Π΅ΡΠ΅Π²ΠΎ β ΡΠ°ΡΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ Π³ΡΠ°ΡΠ°. ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π΅ΡΠ΅Π²Π°:
ΠΡΠΎ Π½Π΅ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ ΠΏΠΎΠΈΡΠΊΠ°! ΠΡΠ΅ ΠΏΠΎΠ΄ ΠΊΠ°Ρ!
Π’Π΅ΡΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΡ
ΠΠΎΡΠ΅Π½Ρ
ΠΠΎΡΠ΅Π½Ρ Π΄Π΅ΡΠ΅Π²Π° β ΡΡΠΎ ΡΠ°ΠΌΡΠΉ Π²Π΅ΡΡ Π½ΠΈΠΉ Π΅Π³ΠΎ ΡΠ·Π΅Π». Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ β ΡΡΠΎ ΡΠ·Π΅Π» A. Π Π΄Π΅ΡΠ΅Π²Π΅ ΠΎΡ ΠΊΠΎΡΠ½Ρ ΠΊ Π»ΡΠ±ΠΎΠΌΡ Π΄ΡΡΠ³ΠΎΠΌΡ ΡΠ·Π»Ρ ΠΌΠΎΠΆΠ΅Ρ Π²Π΅ΡΡΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡΡΡ! ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, Π»ΡΠ±ΠΎΠΉ ΡΠ·Π΅Π» ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΡΠ΅Π½Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΡΠΎΠΌΡ ΡΠ·Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²Π°.
Π ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈ/ΠΏΠΎΡΠΎΠΌΠΊΠΈ
ΠΡΠ΅ ΡΠ·Π»Ρ, ΠΊΡΠΎΠΌΠ΅ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ, ΠΈΠΌΠ΅ΡΡ ΡΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΡΠ΅Π±ΡΠΎ, Π²Π΅Π΄ΡΡΠ΅Π΅ Π²Π²Π΅ΡΡ ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ ΡΠ·Π»Ρ. Π£Π·Π΅Π», ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π²ΡΡΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ, Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ ΡΡΠΎΠ³ΠΎ ΡΠ·Π»Π°. Π£Π·Π΅Π», ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ, ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΉ Ρ Π½ΠΈΠΌ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠΌ ΡΡΠΎΠ³ΠΎ ΡΠ·Π»Π°. ΠΠ°Π²Π°ΠΉΡΠ΅ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅. ΠΠΎΠ·ΡΠΌΠ΅ΠΌ ΡΠ·Π΅Π» B, ΡΠΎΠ³Π΄Π° Π΅Π³ΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ Π±ΡΠ΄Π΅Ρ ΡΠ·Π΅Π» A, Π° ΠΏΠΎΡΠΎΠΌΠΊΠ°ΠΌΠΈ β ΡΠ·Π»Ρ D, E ΠΈ F.
ΠΠΈΡΡ
Π£Π·Π΅Π», Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π΅Ρ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ², Π±ΡΠ΄Π΅Ρ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ Π»ΠΈΡΡΠΎΠΌ Π΄Π΅ΡΠ΅Π²Π°. Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π»ΠΈΡΡΡΡΠΌΠΈ Π±ΡΠ΄ΡΡ ΡΠ²Π»ΡΡΡΡΡ ΡΠ·Π»Ρ D, E, F, G, I, J, K.
ΠΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΡΠ΅ΡΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΡ. ΠΡΡΠ³ΠΈΠ΅ ΠΏΠΎΠ½ΡΡΠΈΡ Π±ΡΠ΄ΡΡ ΡΠ°Π·ΠΎΠ±ΡΠ°Π½Ρ Π΄Π°Π»Π΅Π΅. ΠΡΠ°ΠΊ, Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ β Π΄Π΅ΡΠ΅Π²ΠΎ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ·Π΅Π» Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡΡ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ². ΠΠ°ΠΊ Π²Ρ Π΄ΠΎΠ³Π°Π΄Π°Π»ΠΈΡΡ, Π΄Π΅ΡΠ΅Π²ΠΎ ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ²Π»ΡΡΡΡΡ Π±ΠΈΠ½Π°ΡΠ½ΡΠΌ, ΠΈΠ±ΠΎ ΡΠ·Π»Ρ B ΠΈ H ΠΈΠΌΠ΅ΡΡ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡΡ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ². ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅Π²Π°:
Π ΡΠ·Π»Π°Ρ
Π΄Π΅ΡΠ΅Π²Π° ΠΌΠΎΠΆΠ΅Ρ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡΡ Π»ΡΠ±Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΠ²ΠΎΠΈΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ ΠΏΠΎΠΈΡΠΊΠ° β ΡΡΠΎ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠ½Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°:
- ΠΠ±Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²Π° β Π»Π΅Π²ΠΎΠ΅ ΠΈ ΠΏΡΠ°Π²ΠΎΠ΅ β ΡΠ²Π»ΡΡΡΡΡ Π΄Π²ΠΎΠΈΡΠ½ΡΠΌΠΈ Π΄Π΅ΡΠ΅Π²ΡΡΠΌΠΈ ΠΏΠΎΠΈΡΠΊΠ°.
- Π£ Π²ΡΠ΅Ρ ΡΠ·Π»ΠΎΠ² Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠ·Π»Π° X Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ Π΄Π°Π½Π½ΡΡ ΠΌΠ΅Π½ΡΡΠ΅, Π½Π΅ΠΆΠ΅Π»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ° Π΄Π°Π½Π½ΡΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠ·Π»Π° X.
- Π£ Π²ΡΠ΅Ρ ΡΠ·Π»ΠΎΠ² ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠ·Π»Π° 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). ΠΡ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, ΠΏΠΎΠ½ΡΠ»ΠΈ, ΡΡΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΈΡΠ»ΠΎ 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. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΉ Π±ΡΠ»Π° Π±Ρ ΡΠΈΡΡΠ°ΡΠΈΡ, Π΅ΡΠ»ΠΈ Π±Ρ Π½Π°Π΄ΠΎ Π±ΡΠ»ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΡΠ·Π΅Π», ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ Π»Π΅Π²ΡΠΌ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠΌ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ. ΠΠΎΠ΄ΡΠΌΠ°ΠΉΡΠ΅ ΠΎΠ± ΡΡΠΎΠΌ ΡΠ°ΠΌΠΈ β ΡΠΎΡΠ½Π°Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ.
Π’ΡΠ΅ΡΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ. Π£Π·Π΅Π» ΠΈΠΌΠ΅Π΅Ρ Π΄Π²ΡΡ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ²
ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ. Π Π°Π·Π±Π΅ΡΠ΅ΠΌ Π½Π° Π½ΠΎΠ²ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅.
ΠΠΎΠΈΡΠΊ ΠΏΡΠ΅Π΅ΠΌΠ½ΠΈΠΊΠ°
ΠΠΎΠΏΡΡΡΠΈΠΌ, Π½Π°Π΄ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΡΠ·Π΅Π» Ρ ΠΊΠ»ΡΡΠΎΠΌ 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;
}
ΠΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΌΠ΅ΡΠΎΠ΄Π° 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))
Π‘ΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΡΠΉ ΠΎΠ±Ρ ΠΎΠ΄
ΠΠ±Ρ ΠΎΠ΄ β ΠΏΠΎΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ·Π»Π° Π΄Π΅ΡΠ΅Π²Π° Ρ ΡΠ΅Π»ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ Ρ Π½ΠΈΠΌ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅.
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ ΠΎΠ΄Π°:
- Π‘Π΄Π΅Π»Π°ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π»Π΅Π²ΡΠΌ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠΌ
- Π‘Π΄Π΅Π»Π°ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΡΠΎΠ±ΠΎΠΉ
- Π‘Π΄Π΅Π»Π°ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΠΏΡΠ°Π²ΡΠΌ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠΌ
ΠΠΎΠ΄:
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