áááá«áá»áž
á€áá±á¬ááºážáá«ážááẠbinary ááŸá¬ááœá±áá±ážáá
áºáááºáá»á¬ážá¡ááŒá±á¬ááºážááŒá
áºáááºá áááŒá¬áá±ážáá®á áá±á¬ááºážáá«ážáá
áºáá¯ááºáá±ážáá²á·áá°ážáááºá
áá áºáááºááẠá¡á áœááºážáá»á¬ážááŒáá·áº áá»áááºáááºáá¬ážáá±á¬ node áá»á¬ážáá«áááºáá±á¬ áá±áá¬ááœá²á·á ááºážáá¯á¶ááŒá áºáááºá áá áºáááºááẠááááºáá áºáá¯á á¡áá°ážááŒá áºáááºáá áºáá¯áᯠáá»áœááºá¯ááºááá¯á·ááŒá±á¬ááá¯ááºáááºá áá«á á¥ááᬠáá áºáááº
áááºážááẠbinary ááŸá¬ááœá±ááŸá¯áá
áºááẠááá¯ááºáá«á á¡áá¬á¡á¬ážáá¯á¶áž ááŒááºááœá¬ážááẠá
áá±á«áá¬áááá¬
á¡ááŒá áº
áá áºáááºá¡ááŒá Ạ- áá«ááá°á·áá²á·ááááºáá¯á¶áž node áá«á á¥ááá¬ááœááºá á€áááºááŸá¬ node A ááŒá áºáááºá áá áºáááºáá áºáááºááœááºá áááºážááŒá±á¬ááºážáá áºáá¯áᬠá¡ááŒá áºá០á¡ááŒá¬áž node áá áºáá¯áá®ááá¯á· áŠážáááºááá¯ááºáááºá ááááºáá±á¬á·á áááºááá·áº node ááá¯áááᯠဠnode ááŸáá·áº áááºááá¯ááºáá±á¬ subtree á root á¡ááŒá Ạáá°áááá¯ááºáá«áááºá
ááá/áá¬ážá ááºááŒá±ážáááºáá»á¬áž
root ááŸááœá²á node á¡á¬ážáá¯á¶ážááœáẠá¡á áœááºážáá áºáᯠá¡ááá¡áá»ááŸáááŒá®áž á¡ááŒá¬áž node áá áºáá¯áá®ááá¯á· áŠážáááºáááºá áááºááŸááá áºáá¯áá¡áááºááœááºááŸááá±á¬ node ááá¯áá±á«áºáááºá ááá áá® node áááºááŸááá áºáá¯áá¡á±á¬ááºááœááºááŸáááŒá®áž áááºážááŸáá·áºáá»áááºáááºáá¬ážáá±á¬ node ááá¯áá±á«áºáááºá áá¬ážá ááºááŒá±ážááẠáá® node á¥ááá¬áá áºáá¯áá¯á¶ážááŒáá·áºáá¡á±á¬ááºá node B ááá¯áá°ááŒáá«á áá¯á·á ááá¯á·áá±á¬ááºáááºážááááááẠnode A ááŒá áºááŒá®ážáááºážáááá±ážáá»á¬ážááẠnode Dá E ááŸáá·áº F ááŒá áºáááá·áºáááºá
á¡áááºáá¬áááºáž
ááá±ážáá»á¬ážáááŸááá±á¬ á¡ááœááºááᯠáá áºáááºáá¡ááœááºáá¯áá±á«áºáááºá á¥ááá¬ááœááºá á¡ááœááºáá»á¬ážááẠnode D, E, F, G, I, J, K ááŒá áºáááá·áºáááºá
áá«á á¡ááŒá±áá¶á¡áá¯á¶ážá¡ááŸá¯ááºážáá«á á¡ááŒá¬ážááá±á¬ááá¬ážáá»á¬ážááᯠáááºáááºááœá±ážááœá±ážáá«áááºá ááá¯á·ááŒá±á¬áá·áºá binary tree ááẠnode áá áºáá¯á á®ááœáẠááá±ážáá»á¬áž ááŸá áºáá¯ááẠáááá¯áá±á¬ áá áºáááºáá áºáá¯ááŒá áºáááºá áááºááá·áºááŸááºážáá¬ážááá·áºá¡ááá¯ááºážá á¥ááá¬ááŸáá áºáááºááẠbinary ááŒá áºáááá·áºáááºááá¯ááºáá«á á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº node B ááŸáá·áº H ááœáẠááá±ážááŸá áºáá¯áááºááá¯áá«áááºá á€áááºááŸá¬ ááœááá áºáááºá á¥ááá¬áá áºáá¯ááŒá áºáááºá
tree node ááœá±ááŸá¬ á¡áá»ááºá¡áááºááœá± áá«ááá¯ááºáá«áááºá ááœáááŸá¬ááœá±ááŸá¯áá
áºáááºááẠá¡á±á¬ááºáá«áá¯ááºááá¹áááá»á¬ážáá«ááŸááá±á¬ ááœáá
á¯á¶áá
áºáááºááŒá
áºáááºá
- áááºááŸáá·áºáᬠááŸá áºáá¯á áá¯á¶ážááẠááœáááŸá¬ááœá±áá±ážáá áºáááºáá»á¬ážááŒá áºáááºá
- ááááºáááᯠnode X á áááºáááºá¡ááœá²á node á¡á¬ážáá¯á¶ážááœáẠnode X á data key ááááºááá¯ážáááºáááºážáá±á¬ data key áááºááá¯ážáá»á¬ážááŸááááºá
- áá»áŸááá±á¬ node X á áá¬áááºá¡ááœá²ááŸá node áá»á¬ážá¡á¬ážáá¯á¶ážááœáẠnode X á data key ááááºááá¯ážááẠáá±áá¬áá±á¬á·áááºááá¯ážáá»á¬ážáááºááŒá®ážáá±á¬ ááá¯á·ááá¯áẠáá®áá»áŸáá«áááºá
áá±á¬á· - node á ááá¹ááᬠáá áºáá¯áᯠ(á¥ááá¬á áá¶áá«ááº)á á€áá±á¬á·ááŸáá·áºááá¯ááºáá®ááá·áºáá áºáááºááŒááºá ááºááá¯ááŸá¬ááœá±ááá¯ááºá á±ááẠáá±á¬á·ááá¯á¡ááºáá«áááºá binary ááŸá¬ááœá±ááŸá¯áá áºáááºá á¥ááá¬-
áá áºáááºááŒááºááœááºáž
áá»áœááºá¯ááºááá¯á· ááá¯ážáááºáá¬áááºááŸáá·áºá¡áá»áŸ ááá·áºáá¬ážáááºááŸá¯ ááá¯ážáááºá á±áááºá¡ááœáẠáá¯ááºá¡ááá¯ááºážá¡á á¡áá»áá¯á· (ááŒá áºááá¯ááºáááº) ááᯠáá»áœááºá¯ááºáá±ážáá«áááºá áá¯ááºá¡ááŒáá·áºá¡á á¯á¶ááẠáá±á¬ááºážáá«ážáá¡áá¯á¶ážááœáẠááŸááááá·áºáááºá
áá áºáááºááœáẠnode áá»á¬ážáá«áááºáááºá Node áááºáá±á¬ááºáá¯á¶-
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;
}
//...ПÑÑалÑÐœÑе ЌеÑÐŸÐŽÑ Ñзла
}
node áá áºáá¯á á®ááœáẠááá±ážááŸá áºáá¯áá«ááŸáááẠ( leftChild ááŸáá·áº/ááá¯á·ááá¯áẠrightChild ááá±ážáá»á¬ážááẠnull value áá«ááŸááááá·áºáááº)á á€ááá á¹á ááœáẠáá¶áá«ááºáá±áá¬ááẠnode ááœáẠááááºážáááºážáá¬ážáá±á¬ áá±áá¬ááŒá áºáááºááᯠáááºááá±á¬áá±á«ááºáá±áááºá áá±á¬á· - node áá±á¬á·á
áá¯á¶ážááœá²á·ááŒá®ážááŒá®á á¡áá¯áá áºáááºááœá±á¡ááŒá±á¬ááºáž ááááŸáááºáá²á·ááŒá¿áá¬ááœá±á¡ááŒá±á¬ááºáž ááŒá±á¬ááŒáá¡á±á¬ááºá á€áá±á¬ááºá âáá áºáááºâ áá°áá±á¬ á áá¬ážáá¯á¶ážááŒáá·áº áá»áœááºá¯ááºááẠááœáááŸá¬ááœá±ááŸá¯áá áºáááºá ááá±á¬ááá¬ážááᯠááá¯ááá¯áá«áááºá ááœááá áºáááºááœá²á·á ááºážáá¯á¶-
public class BinaryTree<T> {
private Node<T> root;
//ЌеÑÐŸÐŽÑ ÐŽÐµÑева
}
getLeftChild() ááŸáá·áº getRightChild() áááºážáááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á root á០á¡áááºážá¡ááœááºáá áºáá¯á¡ááŒá Ạáá áºáááºá á¡ááŒá áºááᯠáá»áœááºá¯ááºááá¯á· ááá¯á¡ááºáá«áááºá
áá áºáááºááŸá á¡ááºáááá¯áá®áááºáá»á¬áž
ÐПОÑк
áááºážááŸá¬ áá±á¬ááºáá¬ážáá²á·áá áºáááºááŸááááºááá¯áá«á áá¯á·á áá±á¬á·áá±á¬á·ááŒáá·áº ááŒááºá ááºáá áºáá¯ááᯠáááºááá¯á·ááŸá¬ááááºáááºážá áááºááẠá¡ááŒá áºááŸáá áºáááºá¡á±á¬ááºááá¯á· ááœá±á·áá»á¬ážááŒá®áž áá±á¬á·áááºááá¯ážááᯠáá±á¬áẠnode á áá±á¬á·ááŸáá·áº ááŸáá¯ááºážááŸááºááẠááá¯á¡ááºáááº- á¡áááºá áá±á¬á·ááẠáá±á¬áẠnode á áá±á¬á·áááºáááºážáá«áá áááºážááẠááŸááá«á node á áááºáááºááá¯á· ááœá¬ážáá«á áá¬áááŒá®ážáááºá áá¬áááºááœááºá áá±á¬á·áá»á¬ážáá®áá«áá ááá¯áá»ááºáá±á¬ node ááá¯ááœá±á·áááá·áºáááºá áááºááá¯ááºáᬠáá¯ááº-
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;
}
á¡áááºá áááºááŸáááẠá¡áá»ááºážááŸá®ážááŒá áºááœá¬ážáá«áá ááŸá¬ááœá±ááŸá¯ááẠáá áºáááºáá¡áá¯á¶ážááá¯á· áá±á¬ááºááŸáááœá¬ážááẠ(á¡áá°á¡áá¡ááá·áºááœááºá áááºááẠáá áºááœááºáá¡áááºá¡á ááºáááŸááá±á¬áá±áá¬ááœáẠááŸááá±áááº)á
áááºáá»ááºáá®áá±á¬áá áºáááºááœáẠááŸá¬ááœá±ááŸá¯ á¡ááºáááá¯áá®áááºá áááá±á¬ááºááŸá¯ááᯠáá¯á¶ážáááºááŒáá·áºááŒá áá¯á· (node ââáá»á¬ážááᯠá¡áá®á¡áá»áŸ ááŒáá·áºáá±áá±ááá·áº áá áºáááº)á ááá¯á·áá±á¬áẠááŸá¬ááœá±ááŸá¯ áááá±á¬ááºááŸá¯ááẠO(log(n)) ááŒá áºáááá·áºáááºáá áá±á¬á·ááá áºáááºááẠá¡ááŒá±áᶠ2 ááŒá áºáááºá ááŒáá·áºáá«- áááºáá»ááºáá®áá±á¬ áá áºáááºááœáẠn ááŒááºá ááºáá»á¬áž ááŸááá«áá ááá¯ááá¯áááºááŸá¬ á¡ááá¯áá« á¡ááá·áº á á á¡ááŒá±ááá¯á· log(n) ááŸááááá·áºáááºá áá áºáááºá ááŸá¬ááœá±ááŸá¯ááœááºá áá¶ááá¬áááŒá±áá áºááŸááºážááœááºá áááºááẠá¡ááá·áºáá áºáá¯ááá¯á· áááºážááœá¬ážááá¯ááºáááºá
ááá·áºááœááºáž
ááŸá¬ááœá±ááŸá¯á á¡ááŸá áºáá¬áááᯠáá¯ááºááá¯ááºáá¬ážáá»áŸáẠááá·áºááœááºážááŸá¯ááᯠáá¬ážáááºááẠááá·áºá¡ááœáẠáááºáá²áááºááá¯ááºáá«á áááºááŸá¬ááœá±ááŸá¯ááœááºáá±á¬áºááŒáá¬ážáá±á¬ áá»áá¯ážááá¯ážááá¯ááºá ááºážáá»ááºážáá»á¬ážá¡ááá¯ááºáž áá áºáááºáá¡ááœááºáá áºááœááºááá¯á·áááºážááẠááá¯á¡ááºááŒá®áž áá±á¬á·áá±á«áº áá°áááºá áááºážááá¬ážá ááºááŒá±ážáááºááŒá áºáá¬áááº- ááẠááá¯á·ááá¯áẠáá¬á á¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºáž-
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;
}
}
}
}
}
á€ááá
á¹á
ááœááºá áááºááŸá node á¡ááŒááºá áááºááŸá node á parent á¡ááŒá±á¬ááºáž á¡áá»ááºá¡áááºáá»á¬ážááᯠááááºážáááºážááẠááá¯á¡ááºáá«áááºá current ááẠnull ááŸáá·áº áá®áá»áŸáá±á¬á¡áá«á parent variable ááœáẠáá»áœááºá¯ááºááá¯á·ááá¯á¡ááºáá±á¬á
á¬ááœááºáá«ááŸááááºá
ááá·áºááœááºážááŒááºážá áááá±á¬ááºááŸá¯ááẠááŸá¬ááœá±ááŸá¯ ááŸáá·áº á¡áá°áá°áááºááŒá
áºááẠ- O(log(n))á
áááºááŸá¬ážáá±áž
áááºááŸá¬ážááŒááºážááẠáá áºáááºáá áºáááºáá±á«áºááœáẠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáá±á¬ á¡áááºáá²áá¯á¶áž áá¯ááºáá±á¬ááºáá»ááºááŒá áºáááºá áá»áœááºá¯ááºááá¯á· áá»ááºáá áºááá·áº á¡á áááºá¡ááá¯ááºážááᯠáŠážá áœá¬ ááŸá¬ááœá±ááẠááá¯á¡ááºáááºááŸá¬ ááŸááºážáá«áááºá ááá¯á·ááŒá áºáá»áŸáẠá¡áááºááá¯á·áááºážá áááºážáá¡ááá¯ážá¡áá¬ážááᯠnull á¡ááŒá Ạááá¯ážááá¯ážááŸááºážááŸááºáž áááºááŸááºáá«áá ဠnode ááẠroot ááŒá áºááá·áº subtree ááŸáá·áºáááºáááºáá±á¬ á¡áá»ááºá¡áááºáá»á¬ážááᯠáá¯á¶ážááŸá¯á¶ážáááºááŒá áºáá«áááºá áá áºáááºáááºááŸá¬ážááŒááºážáááºážáááºážááᯠáá¯á¶ážáá»áá¯ážááœá²áá¬ážáááºá
áááááá á¹á á áá»ááºááá¯ááºáá±á¬ node ááœáẠááá±ážáá»á¬ážáááŸááá«á
áá»ááºááá¯ááºáá±á¬ node ááœáẠááá±ážáá»á¬ážááá«áá«áá áááºážááẠá¡ááœááºááŒá áºáááºáᯠááá¯ááá¯áááºá ááá¯á·ááŒá±á¬áá·áºá áááºááẠáááºážááááááááºáááºááá±áž ááá¯á·ááá¯áẠáá¬áááºááá±ážá¡ááœááºáá»á¬ážááᯠnull á¡ááŒá áºáááºááŸááºááá¯ááºáááºá
áá¯áááááá á¹á á áá»ááºáá áºáááá·áº áá¯ááºááœáẠááá±ážáá áºáá¯ááŸááááºá
áá®ááá á¹á á ááááºááŒá®áž áááŸá¯ááºááœá±ážáá«áá°ážá áá»áœááºá¯ááºááá¯á·á á¥ááá¬ááᯠááŒááºááŒáá·áºááŒáá«á áá¯á·á áá±á¬á· 14 áá«ááŒááºáá áºáá¯ááᯠáá»ááºááẠááá¯á¡ááºáááºááá¯áá«á áá¯á·á áááºážááẠáá®áž 10 áá«áá±á¬ node áá áºáá¯á ááŸááºáááºáá±á¬áá»áá¯ážáááºááŒá áºáá±á¬ááŒá±á¬áá·áº áááºážááá¬ážá ááºááŒá±ážáááºáá»á¬áž (á€ááá á¹á ááœáẠááŸááºáááºáá±á¬áá áºáá¯áááº) ááœáẠáá±á¬á· 10 áááºááŒá®ážáá±áááºááᯠááá±á¬áá°áá«áááºá áááºážááᯠáá áºáááºá០á¡ááœááºááá° âááŒááºâ ááá¯ááºááŒá®áž áá»ááºááá¯ááºáá±á¬ node á ááá±ážááŸáá·áº áááááᯠááá¯ááºááá¯ááºáá»áááºáááºááá¯ááºááẠá ááá¯ááá¯áááºááŸá¬á node ááᯠkey 10 á០node 13 ááŸáá·áº áá»áááºáááºáá«á áááºážá parent á áááºáááºááá±ážááŒá áºáá±á¬ node áá áºáá¯ááᯠáá»ááºáááºááá¯á¡ááºáá«á á¡ááŒá±á¡áá±ááẠá¡áá¬ážáá°ááŒá áºáááá·áºáááºá áááºááá¯ááºááá¯áẠá ááºážá á¬ážááŒáá·áºáá«- á¡ááá¡áá» á¥ááá¬áá áºáá¯á
ááááááá á¹á á node áá áºáá¯ááœáẠááá±ážááŸá áºáá¯ááŸááááºá
á¡áááºáá²áá¯á¶ážááá á¹á á á¥ááá¬á¡áá áºááá¯ááŒáá·áºáá¡á±á¬ááºá
áááºáá¶áá°ááá¯ááŸá¬áá«á
key 25 áá«áá±á¬ node áá áºáá¯ááᯠáá»ááºááẠááá¯á¡ááºáááºááá¯áá«á áá¯á·á áááºážáá±áá¬ááœáẠáááºáá°ááᯠááá·áºááá·áºááááºážá áá°á·áá±á¬ááºááá¯ááºáá áºáá±á¬áẠ(descendants or descendants of descendants) ááŒá áºáá¬ááááºá áááºáá¶áá°(áááºááŸá¬ážáá¶áááá·áº node ááá±áá¬ááá¯ááá°ááá·áºáá°)á
áááºáá°á áááºáá¶ááá·áºáááºááá¯áᬠáááºááá¯áá¬ážáááºááá¯ááºááá²á áááºááá¯ááºá¡á¬ážááŒáá·áºá á€áááºááŸá¬ áá»ááºááá¯ááºáá±á¬ node á០áá±á¬ááºá¡ááŒá®ážáá¯á¶ážáá±á¬á·ááŒá áºááŒá®áž áá áºáááºááŸá áá¯ááºáá áºáá¯ááŒá áºáááºá algorithm ááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºáááºá áááºážá áá¬áááºáá¬ážá ááºááŒá±ážáááºááá¯á· áááºááœá¬ážáááºááá¯á¡ááºááẠ(áááºáá¶áá±á¬áá®ážááẠáá»ááºááá¯ááºáá±á¬ node ááá±á¬á·ááẠááá¯ááŒá®ážáááºáᯠááá¯áá¬ážááŒá®ážááŒá áºáá±á¬ááŒá±á¬áá·áº áá¬áááºááœáẠá¡ááŒá²ááŸááá±ááẠááá¯á¡ááºáááº)á ááá¯á·áá±á¬áẠáá¬áááºáááºáá¶áá°á áááºáááºáá¬ážá ááºááŒá±ážáááºáá»á¬ážá ááœááºážáááºááᯠááŒááºááœá¬ážáá«á . á¥ááá¬ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá±á¬á· 35 áá«áá±á¬ node ááá¯á·ááœá¬ážáᬠáááºážááááºáááºááá±ážáá»á¬ážá ááœááºážáááºáá»á¬ážááŸáá áºááá·áº á¡ááœááºáá®ááá¯á·ááœá¬ážááẠ- á€á¡ááŒá±á¡áá±ááœááºá á€ááœááºážáááºááẠáá±á¬á· 30 áá«áá±á¬ node ááá áºáá¯áááºážáá¬áá«áááºáá«áááºá á¡ááá¡áá»ááŒá±á¬ááá»áŸáẠáá»áœááºá¯ááºááá¯á· ááŸá¬ááœá±áá±áá«áááºá áá»áœááºá¯ááºááá¯á·ááŸá¬ááœá±áá±áá±á¬ node áááºááŒá®ážáá±á¬ node á¡á á¯ááœáẠá¡áá±ážáááºáá¯á¶áž node á¡ááœááºá
áááºáá¶ááŸá¬ááœá±áá±ážáááºážáááºážáá¯ááº-
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))
á¡áá»áá¯ážáá» ááŸá±á¬ááºááœááºáž
Traversal ááẠáááºážááá¯áá¯ááºáá±á¬ááºááŸá¯á¡áá»áá¯á·ááŒá¯áá¯ááºáááºá¡ááœáẠáá áºáááºá node áá áºáá¯á á®ááá¯á· ááœá¬ážáá±á¬ááºááŒááºážááŒá áºáááºá
áááºáá«ááá²áá² á¡áá»áá¯ážáá»áá±á¬ ááŒááºáááºážááŸá¯ááá¯ááºáᬠá¡ááºáááá¯áá®áááº-
- áááºáááºááá±ážááŸá¬ áá¯ááºáá±á¬ááºáá»ááºáá áºáá¯áá¯ááºáá«á
- áááºááá¯ááºááá¯ááºáá¯ááºáá±á¬ááºáá«á
- ááŸááºáááºáá±á¬ ááá±ážá¡áá±á«áº áá¯ááºáá±á¬ááºáá»ááºáá áºáᯠááŒá¯áá¯ááºáá«á
áá¯ááº:
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) ááá¯á· ááá¯ááœááºážááŒááºáž
áá áºáááºááᯠáááºáá»ááºááá®á¡á±á¬áẠáá¯ááºáá¬ážááẠááẠáá±á¬áºáá±á¬áºáá»á¬ážáá»á¬áž ááááá¬ážááááŒááŸá¬áá«á á¥ááá¬á áá áºáááºáá áºáááºááœáẠááá¯ážáá¬áá±á¬áá±á¬á·áá»á¬ážáá«áá±á¬ node áá»á¬ážááᯠááá·áºáá«- 1,2,3,4,5,6... ááá¯á·áá±á¬áẠáá áºáááºááẠááá·áºááºáá»áááºáá¬ážáá±á¬á á¬áááºážááŸáá·áº á¡áááºážáááºáááºáá°áá«áááá·áºáááºá áá¯ááºáá«áááºá áá áºáááºááẠáááºážááá áºáááºááœá²á·á ááºážáá¯á¶á¡á¬áž áá¯á¶ážááŸá¯á¶ážáááºááŒá áºááŒá®ážá ááá¯á·ááŒá±á¬áá·áº áá±áá¬áááºáá±á¬ááºááŒááºážá áááá±á¬ááºááŸá¯ááŸááááºá ááŸá¬ááœá±ááŸá¯á ááá·áºááœááºážááŸá¯á ááŸáá·áº áá»ááºááŒááºážáá¯ááºáá±á¬ááºááŸá¯áá»á¬ážá ááŸá¯ááºááœá±ážááŸá¯ááẠáá»áááºáááºáá¬ážáá±á¬á á¬áááºážáá áºáá¯á áá°áá®áááá·áºáááº- O(n)á áá«á binary tree ááœá±áá²á· á¡áá±ážááŒá®ážáá¯á¶áž á¡á¬ážáááºážáá»ááºááœá±áá²á áá áºáá¯áá«á
á
á¬áááºážááœááºážá¡áá¯á¶ážááŒá¯áá°áá»á¬ážáᬠá
á
áºáááºážááœáẠáá«áááºááá¯ááºáá«áááºá
áá»áœááºá¯ááºááẠá¡áá»ááºá¡áá»á¬áá»áá±á¬áá±áá¬ááá¯á· ááá±á¬ááºáᬠááŒá¬ááŒá®ááŒá áºááŒá®áž áááºááá·áºá¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠáááºááá¯ááŒáá·áºááá¯ááááºážáá°ááá·áº áá±á¬ááºážáá«ážáá»á¬ážááᯠááááá¯áá«áááºá
-
áá±áá¬ááœá²á·á ááºážáá¯á¶áá»á¬áž
-
á¡ááºáááá¯áá®áááºáá»á¬áž (DPá ááŒááºáá±á¬ááºááŒááºážá áá±áá¬áá»á¯á¶á·ááŒááºáž á áááº)
-
áááºááœá±á·ááááœáẠáá±áá¬ááœá²á·á ááºážáá¯á¶áá»á¬ážááŸáá·áº á¡ááºáááá¯áá®áááºáá»á¬ážááᯠá¡áá¯á¶ážáá»ááŒááºážá
-
Java ááœáẠAndroid á¡ááá®áá±ážááŸááºážáá»á¬áž áááá¯ááááºáá±ážááŒááºážá
-
Java ááœáẠáááºá¡ááºááá®áá±ážááŸááºážáá»á¬áž áááá¯ááááºáá±ážááŒááºážá
á¡áá¯á¶ážááŒá¯áá° 2 áŠáž áá²áá±ážáá²á·áááºá á¡áá¯á¶ážááŒá¯áá° 1 áŠáž ááŸá±á¬ááºáá²á·áááºá
á¡áááºážá¡ááŒá
áº: www.habr.com