ααααΆααα»ααα»α
α’ααααααααααΊα’αααΈααΎαααΎααααααααααααααααααααΈαα ααααΈαααααααα»αααΆααααααα’ααααααα½αα’αααΈ
αααααΆαααΊααΆαα ααΆαααααααααα·αααααααααααΆαααααΆααααααααααΆααααααααα ααΎαα’αΆα αα·ααΆαααΆαααΆααΎαααΎααΊααΆααααΈαα·αααααααααΆα ααα αααααΆα§ααΆα αααααΎαααΎα
ααααα·ααααααΆαααααΆαααααααααααααααααααααΈααα! α’αααΈααααααααΆαααΊαααα·ααα
αααααααΆαααΆαα!
ααααα
ααΎα
α«αααΎαααΎ ααΊααΆααααΆααααααΌααααα»αα αααα»αα§ααΆα ααααααααΊααΆ node A. αα αααα»ααααααΆα ααΆαααααααΌααα½αααα»ααααααααα’αΆα ααΆαααΈ root αα ααΆαα node αααααααα! ααΆααα·αααααΆααααΆαα½αα’αΆα ααααΌαααΆαα αΆαααα»αααΆααΆα«αααα’αα»αααααΆααααααααΌαααααΆααΉαααααΆαααααα
αͺαα»αααααΆα / ααΌαα α
ααααΆααααΆααα’ααααΎαααααα root ααΆαααααα½ααααΆααα·αααααΆαααααααΆααα αααααααΆααααααααααα ααααΆααααΆαααΎααααΆαααα αα α»ααααααααααΌαααΆαααα α ααΆ αͺαα»αααααΆα ααααΆαααααα ααααΆααβαααβααΆαβααΈααΆααβαα βααΆααααααβαα αα α»ααααααβαα·αβααΆαβαααααΆααβαα βααΆβααααΌαβααΆαβα α β ααΌαα α ααααΆαααααα ααΌαααΎαα§ααΆα ααααα½αα ααααααΆαα 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;
}
//...ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠ·Π»Π°
}
ααααΆααααΈαα½ααααΆαααΌαααΈαααΆαα (ααΆαα·αααΆα’αΆα αα αα½α αααααΌαααααα αα·α/α¬ααααΆα ααΌαααΉααα»αααΆαααα)α α’ααααααα ααααΆαααααΆαααα»αααααΈααααα·αααααααααααΊααΆαα·ααααααααααααααΆαα»ααααα»αααααΆααα ααααΆααα α»α - ααααΆααα α»α ααααΆααα
ααΎαβααΆαβααβααΎαβα αααβααα α₯α‘αΌαβααΌαβαα·ααΆαβα’αααΈβαααα αΆβααααααβα’αααΈβααΎαααΎα αα ααΈααα αα·αααΆαααααα ααΆααα "ααΎαααΎ" ααΉαααΆααααααΆ αααα·ααααααααΆαααααααααααααααααααααΈαα αα ααΆααααααααααΎαααΎαααααΈαα
public class BinaryTree<T> {
private Node<T> root;
//ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π΅ΡΠ΅Π²Π°
}
αααα»αααΆαααΆααΆαααααΆαα ααΎαααααΌαααΆααα root αααααααΆαααα»ααααα ααΈαααααααΈ root αααααααΎαα·ααΈααΆααααα getLeftChild() αα·α getRightChild() α’αααα’αΆα αα αααααααΆααααΆαα½ααααααααΆαα
αααα½ααααααααΆαααΎαααΎ
ΠΠΎΠΈΡΠΊ
α αΌααα·ααΆαααΆα’αααααΆαααΎαααΎαααααΆαααΆααααα ααΎααααΎααΌα ααααα ααΎααααΈαααααααααΆαα»ααΆαα½α 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;
}
ααααα·αααΎα ααααααααΆαααΆαααα αααααΆααα·ααΆαα‘αΎααα·αααΆαααΆααααα α»ααααα ααααααΎαααΎ (αα ααααα·ααααα·α α’ααααααα·ααα αααα»αααααααααααα·αααΆααα αααα»αααΎαααΎ - ααΌαααααΉααα½α)α
αα·α αΆαααΆααΈααααα·αααααΆααααααα½ααααααααΆαααααααααα ααΎαααααΆααααααΆααα»αααααΆα (αααααΆααααααααΆααααααΌαααΆαα ααα αΆαα αααΎα α¬αα·α ααααΎαααααΆ)α αααααΆααααααααα·αααααΆαααααΆααααααααααΉαααΆα 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;
}
}
}
}
}
αααα»αααααΈααα ααααααααΈααΎααααΆαααα
αα
α»αααααα α
αΆαααΆα
αααααΌααααααΆαα»αααααααΆαα’αααΈααααααααααΆαααα
αα
α»ααααααα αα
ααααααα
ααααααααΆαααΆααα α’αααααααΉαααΆααααααΉααααααΎαααααΌαααΆαα
ααααα·αααααΆαααααΆααααα
αΌαα
αααΆααααΉαααΌα
ααααΆααΉαααΆααααααααααα - O(log(n))α
αα»α
ααΆααα»αααΊααΆααααα·ααααα·ααΆααααααα»αααααΆααααα»ααααααΉαααααΌαααααΎααΆαα½ααααααΆαα ααΆα αααΆααααΆααααΆααααΌαααΆααΉαα αΆαααΆα ααααα»αααΆααααααααααΆαα»αααααΎαααΉαααα ααα ααα»αααααααααΆααααα’αααΈ? ααααα·αααΎααΎαααααΆαααααααααααα ααααΈαααααααααΆαα ααΆ null αααααΎαααΉαααΆαααααααααααΆαα’αααΈα’αα»αααααΆααααα«αααααααΆααΆααααΆαααααα αα·ααΈααΆαααααααααΎαααΎα ααα ααααΆααΈααααΈα
ααααΈααΈαα½αα ααααΆαααααααααΌαααα αααα·αααΆαααΌαααα
ααααα·αααΎααααΆαααααααααΌααα»ααα·αααΆαααΌααα ααΆααααααΆααΆααΆααααΉαα ααΌα αααα α’αααααααΆααααα’αΆα αααααααΆα leftChild α¬ rightChild ααααααααααααΆαα ααΆ nullα
ααααΈααΈααΈαα ααααΆαααααααααΌαααα ααααΆαααΌααα½αα
ααααΈααααααα·ααα·ααΆαααααΆαααααα α αΌαααΎααααααααα α§ααΆα αααααααααΎαα α§αααΆααΆααΎαααααΌααα»αααΆαα»αααααΆαααΌαααααα 14α αααααααααΆ αααααΆαααΆααΆααΌαααααΉαααααΌαααααααααΆαααααααΆαααΌααα 10 ααΌα ααααααΌαα α ααααααΆ (αααα»αααααΈααα αααααααΉαααααΌα) ααΉαααΆαααΌαααααααΆα 10 ααΌα ααααα’ααα α’αΆα "ααΆαα" ααΆαααΆαααΆααααα½αααΈαααααΆα α αΎαααααΆαααααααααααΆαααα ααΌαααααααααΆαααααααααΌαααΆααα»α αααααΊα§α ααααΆαα node ααΆαα½α key 10 αα node 13. ααααΆαααΆαααΉαααααααααααΆ ααααα·αααΎααΎαααααΌααα»α node αααααΆααΌαααΆαααααααααα parent ααααααΆα αα·αα’αααΈααΆαααααΆαααααα½αα’ααα - ααΆααααααααααα·αααααΆααα
ααααΈααΈααΈα 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))
ααααΌαααΆαααααΈααααααΈ
ααΆαααααααΆααααΊααΆααΆααα ααΎαααααΆααααΈαα½αααααααααΆαααΎααααΈααααΎα’αααΈαα½αααΆαα½αααΆα
αααα½ααααααααΆαααααααΆαααααΈααααααΈαααααα
- ααααΎαααααααΆαααΎααΌαααΆαααααα
- ααααΎαααααααΆαααΆαα½ααααα½αα’ααα
- ααααΎαααααααΆαααΎααΌαααααΉαααααΌαα
αααααΌα:
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());
}
}
}
PS
ααΆαα α»αααααααα ααΆ O(n)
α’αααβααΆβα αααΎαβαααα ααβααΆβααΆαβαααβαααααΆααα α α»αβααΎβααααΎβαααα βα²ααβααΎαβααΎβααααΆαβααααΉα? α§ααΆα ααα ααΆααααααΆαααααα»ααααααΆαααΆαα½αααΉαααααΆααα α»α ααΎαα‘αΎαα 1,2,3,4,5,6... αααααΆαααααααααΆαααΉαααΉαααΎααααααααΈαααααΈαααααΆαααααΆααα αααα αΎα αααααΆαααΉαααΆααααααα ααΆαααααααααααααΆαααααααΆ ααΌα ααααα αΎαααααα·αααααΆαααααΆαα αΌαααααΎαα·ααααααα ααΆααααα»αααααΆαααααΆαααααααα ααΆααααα αΌα αα·αααΆααα»αααΉαααααΆααα ααΆααΌα ααααΆαα ααΉααααααΈαααααΆαααααΆααα O(n)α αααααΊααΆααΆαααααΆαααααα»ααα½ααα αααα»ααααα·ααααααααα»α αα»ααα·ααααα·ααααΎαααΎαααααΈαα
ααΆαααα’αααααααΎααααΆαααααααΆαα
α»ααααααααα»ααααααααα’αΆα
α
αΌααα½ααααα»αααΆααααααααα·αααα
αααα»αβαα·αβααΆαβααβ Habre ααΌαβααβα αΎαβ α αΎαβαααα»αβα ααβααΉαβααΆβααΎβα’αααααβααΆβααααβαααβα’αααβα ααβααΎαβαααααα?
-
αα ααΆαααααααααα·αααααα
-
αααα½ααααααααΆα (DP, recursion, αααα αΆαααα·ααααααααα)
-
ααΆαα’αα»αααααα ααΆαααααααααα·αααααα αα·ααααα½ααααααααΆααααα»αααΈαα·ααα·α
-
ααΆαααααααααααα·ααΈ Android αα αααα»α Java
-
αααααα·ααΈ Java Web Application Programming
α’αααααααΎααααΆαα 2 ααΆααααΆαααααααααα α’αααααααΎααααΆαα 1 ααΆααααααΌαααΆαα αΆαααΆααα
αααααα www.habr.com