Prelude
рдпреЛ рд▓реЗрдЦ рдмрд╛рдЗрдирд░реА рдЦреЛрдЬ рд░реВрдЦрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рд╣реЛред рдореИрд▓реЗ рднрд░реНрдЦрд░реИ рдмрд╛рд░реЗрдорд╛ рдПрдЙрдЯрд╛ рд▓реЗрдЦ рдЧрд░реЗрдВ
рдПрдХ рд░реВрдЦ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реЛ рдЬрд╕рдорд╛ рдХрд┐рдирд╛рд░рд╣рд░реВ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд┐рдПрдХрд╛ рдиреЛрдбрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рд╣реБрдиреНрдЫрдиреНред рд╣рд╛рдореА рднрдиреНрди рд╕рдХреНрдЫреМрдВ рдХрд┐ рд░реВрдЦ рдЧреНрд░рд╛рдлрдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЗрд╕ рд╣реЛред рдпрд╣рд╛рдБ рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рд░реВрдЦ рдЫ:
рдпреЛ рдмрд╛рдЗрдирд░реА рдЦреЛрдЬ рд░реВрдЦ рд╣реЛрдЗрди! рд╕рдмреИ рдХрд╛рдЯрд┐рдПрдХреЛ рдЫ!
рдЯрд░реНрдорд┐рдирд▓рдЬреА
рд░реВрдЯ
рд░реБрдЦрдХреЛ рдЬрд░рд╛ - рдпреЛ рдпрд╕рдХреЛ рд╢реАрд░реНрд╖ рдиреЛрдб рд╣реЛред рдЙрджрд╛рд╣рд░рдгрдорд╛, рдпреЛ рдиреЛрдб рдП рд╣реЛред рд░реВрдЦрдорд╛, рдПрдЙрдЯрд╛ рдорд╛рддреНрд░ рдмрд╛рдЯреЛрд▓реЗ рд░реВрдЯрдмрд╛рдЯ рдЕрд░реНрдХреЛ рдиреЛрдбрдорд╛ рд▓реИрдЬрд╛рди рд╕рдХреНрдЫ! рд╡рд╛рд╕реНрддрд╡рдорд╛, рдХреБрдиреИ рдкрдирд┐ рдиреЛрдбрд▓рд╛рдИ рдпрд╕ рдиреЛрдбрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рд╕рдмрдЯреНрд░реАрдХреЛ рдореВрд▓рдХреЛ рд░реВрдкрдорд╛ рдорд╛рдиреНрди рд╕рдХрд┐рдиреНрдЫред
рдЖрдорд╛рдмрд╛рдмреБ / рд╕рдиреНрддрд╛рди
рд░реВрдЯ рдмрд╛рд╣реЗрдХ рд╕рдмреИ рдиреЛрдбрд╣рд░реВрдорд╛ рдЕрд░реНрдХреЛ рдиреЛрдбрдорд╛ рдкреБрдЧреНрдиреЗ рдПрдЙрдЯрд╛ рдХрд┐рдирд╛рд░рд╛ рд╣реБрдиреНрдЫред рд╣рд╛рд▓рдХреЛ рдорд╛рдерд┐ рд░рд╣реЗрдХреЛ рдиреЛрдбрд▓рд╛рдИ рднрдирд┐рдиреНрдЫ рдЕрднрд┐рднрд╛рд╡рдХ рдпреЛ рдиреЛрдбред рд╣рд╛рд▓рдХреЛ рдПрдХ рдореБрдирд┐ рд╕реНрдерд┐рдд рдиреЛрдб рд░ рдпрд╕рд▓рд╛рдИ рдЬрдбрд╛рди рднрдирд┐рдиреНрдЫ рд╡рдВрд╢рдЬ рдпреЛ рдиреЛрдбред рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВред рдиреЛрдб 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 рдмрдЪреНрдЪрд╛рд╣рд░реВрдорд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реБрдиреЗрдЫ)ред рддрдкрд╛рдИрдВрд▓реЗ рд╕рд╛рдпрдж рдорд╣рд╕реБрд╕ рдЧрд░реНрдиреБрднрдпреЛ рдХрд┐ рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдирдореНрдмрд░ рдбрд╛рдЯрд╛ рдиреЛрдбрдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдПрдХреЛ рдбрд╛рдЯрд╛ рд╣реЛ; рдХреБрдЮреНрдЬреА - рдиреЛрдб рдХреБрдЮреНрдЬреАред
рд╣рд╛рдореАрд▓реЗ рдЧрд╛рдБрдареЛрд▓рд╛рдИ рдХреНрд░рдордмрджреНрдз рдЧрд░реЗрдХрд╛ рдЫреМрдВ, рдЕрдм рд░реВрдЦрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдерд┐рдЪреНрдиреЗ рдмрд╛рд░реЗ рдХреБрд░рд╛ рдЧрд░реМрдВред рдпрд╕рдкрдЫрд┐, "рд░реВрдЦ" рд╢рдмреНрджрдмрд╛рдЯ рдо рдмрд╛рдЗрдирд░реА рдЦреЛрдЬ рд░реВрдЦрдХреЛ рдЕрд╡рдзрд╛рд░рдгрд╛рд▓рд╛рдИ рдмреБрдЭрд╛рдЙрдБрдЫреБред рдмрд╛рдЗрдирд░реА рд░реВрдЦ рд╕рдВрд░рдЪрдирд╛:
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)) рд╣реБрдиреЗрдЫ, рд░ logarithm рдЖрдзрд╛рд░ 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))ред
рдореЗрдЯрд╛рдЙрдиреБрд╣реЛрд╕реН
рд╣рдЯрд╛рдЙрдиреЗ рд╕рдмреИрднрдиреНрджрд╛ рдХрдард┐рди рдХрд╛рд░реНрдп рд╣реЛ рдЬреБрди рд░реВрдЦрдорд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджрдЫред рдпреЛ рд╕реНрдкрд╖реНрдЯ рдЫ рдХрд┐ рдкрд╣рд┐рд▓реЗ рд╣рд╛рдореАрд▓реЗ рддрддреНрд╡ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдЬреБрди рд╣рд╛рдореА рдореЗрдЯрд╛рдЙрди рдЬрд╛рдБрджреИрдЫреМрдВред рддрд░ рддреНрдпрд╕рдкрдЫрд┐ рдХреЗ? рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдпрд╕рдХреЛ рд╕рдиреНрджрд░реНрднрд▓рд╛рдИ рд╢реВрдиреНрдпрдорд╛ рд╕реЗрдЯ рдЧрд░реНрдпреМрдВ рднрдиреЗ, рд╣рд╛рдореАрд▓реЗ рдпреЛ рдиреЛрдб рд░реВрдЯ рднрдПрдХреЛ рд╕рдмрдЯреНрд░реАрдХреЛ рдмрд╛рд░реЗрдорд╛ рдЬрд╛рдирдХрд╛рд░реА рдЧреБрдорд╛рдЙрдиреЗрдЫреМрдВред рд░реВрдЦ рд╣рдЯрд╛рдЙрдиреЗ рд╡рд┐рдзрд┐рд╣рд░реВ рддреАрди рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдЫрдиреНред
рдкрд╣рд┐рд▓реЛ рдХреЗрд╕ред рдореЗрдЯрд╛рдЗрдПрдХреЛ рдиреЛрдбрдХреЛ рдХреБрдиреИ рдмрдЪреНрдЪрд╛ рдЫреИрди
рдпрджрд┐ рдиреЛрдб рдореЗрдЯрд╛рдЗрдПрдХреЛ рдЫ рднрдиреЗ рдХреБрдиреИ рдмрдЪреНрдЪрд╛ рдЫреИрди, рдпрд╕рдХреЛ рдорддрд▓рдм рдпреЛ рдкрд╛рдд рд╣реЛред рддрд╕рд░реНрде, рддрдкрд╛рдИрд▓реЗ рдпрд╕рдХреЛ рдЕрднрд┐рднрд╛рд╡рдХрдХреЛ leftChild рд╡рд╛ rightChild рдлрд┐рд▓реНрдбрд╣рд░реВрд▓рд╛рдИ рд╢реВрдиреНрдпрдорд╛ рд╕реЗрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
рджреЛрд╕реНрд░реЛ рдХреЗрд╕ред рдореЗрдЯрд╛рдЙрди рдиреЛрдбрдорд╛ рдПрдЙрдЯрд╛ рдмрдЪреНрдЪрд╛ рдЫ
рдпреЛ рдорд╛рдорд▓рд╛ рдкрдирд┐ рдзреЗрд░реИ рдЬрдЯрд┐рд▓ рдЫреИрдиред рд╣рд╛рдореНрд░реЛ рдЙрджрд╛рд╣рд░рдгрдорд╛ рдлрд░реНрдХреМрдВред рдорд╛рдиреМрдВ рдХрд┐ рд╣рд╛рдореАрд▓реЗ рдХреБрдЮреНрдЬреА 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;
}
рдореЗрдЯрд╛рдЙрдиреЗ рд╡рд┐рдзрд┐рдХреЛ рд▓рд╛рдЧрд┐ рдкреВрд░реНрдг рдХреЛрдб:
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)ред рдпреЛ рд╕рдмреИрднрдиреНрджрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдордзреНрдпреЗ рдПрдХ рд╣реЛ, рдореЗрд░реЛ рд╡рд┐рдЪрд╛рд░рдорд╛, рдмрд╛рдЗрдирд░реА рд░реВрдЦрд╣рд░реВрдХреЛ рд╣рд╛рдирд┐ред
рджрд░реНрддрд╛ рднрдПрдХрд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдорд╛рддреНрд░ рд╕рд░реНрд╡реЗрдХреНрд╖рдгрдорд╛ рднрд╛рдЧ рд▓рд┐рди рд╕рдХреНрдЫрдиреНред
рдо рдзреЗрд░реИ рд▓рд╛рдореЛ рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ рд╣рдмрдорд╛ рднрдПрдХреЛ рдЫреИрди, рд░ рдо рдЬрд╛рдиреНрди рдЪрд╛рд╣рдиреНрдЫреБ рдХрд┐ рддрдкрд╛рдИ рдХреБрди рд╢реАрд░реНрд╖рдХрд╣рд░реВрдорд╛ рдердк рд▓реЗрдЦрд╣рд░реВ рд╣реЗрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ?
-
рдбрд╛рдЯрд╛ рд╕рдВрд░рдЪрдирд╛
-
рдПрд▓реНрдЧреЛрд░рд┐рджрдо (рдбреАрдкреА, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐, рдбрд╛рдЯрд╛ рдХрдореНрдкреНрд░реЗрд╕рди, рдЖрджрд┐)
-
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рдирдорд╛ рдбрд╛рдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдЖрд╡реЗрджрди
-
рдЬрд╛рднрд╛рдорд╛ рдПрдиреНрдбреНрд░реЛрдЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ
-
Java рдорд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ
2 рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдорддрджрд╛рди рдЧрд░реЗред рез рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд░реЛрдХрд┐рдПред
рд╕реНрд░реЛрдд: www.habr.com