рдмрд╛рдпрдирд░реА рдЯреНрд░реА рдХрд┐рдВрд╡рд╛ рдмрд╛рдпрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рдХрд╕реЗ рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛

рд╣рд╛ рд▓реЗрдЦ рдмрд╛рдпрдирд░реА рд╢реЛрдз рдЭрд╛рдбрд╛рдВрдмрджреНрджрд▓ рдЖрд╣реЗ. рдореА рдЕрд▓реАрдХрдбреЗ рдПрдХ рд▓реЗрдЦ рдХреЗрд▓рд╛ рдЖрд╣реЗ Huffman рдкрджреНрдзрдд рд╡рд╛рдкрд░реВрди рдбреЗрдЯрд╛ рдХреЙрдореНрдкреНрд░реЗрд╢рди. рддреЗрдереЗ рдореА рдмрд╛рдпрдирд░реА рдЭрд╛рдбрд╛рдВрдХрдбреЗ рдЬрд╛рд╕реНрдд рд▓рдХреНрд╖ рджрд┐рд▓реЗ рдирд╛рд╣реА, рдХрд╛рд░рдг рд╢реЛрдз, рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ рд╣рдЯрд╡рд┐рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрджреНрдзрддреА рд╕рдВрдмрдВрдзрд┐рдд рдирд╛рд╣реАрдд. рдЖрддрд╛ рдореА рдЭрд╛рдбрд╛рдВрдмрджреНрджрд▓ рдПрдХ рд▓реЗрдЦ рд▓рд┐рд╣рд╛рдпрдЪреЗ рдард░рд╡рд▓реЗ. рдЪрд▓рд╛ рд╕реБрд░реВ рдХрд░реБрдпрд╛.

рдЯреНрд░реА рд╣реА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдХрдбрд╛рдВрдиреА рдЬреЛрдбрд▓реЗрд▓реЗ рдиреЛрдбреНрд╕ рдЕрд╕рддрд╛рдд. рдЖрдкрдг рдЕрд╕реЗ рдореНрд╣рдгреВ рд╢рдХрддреЛ рдХреА рдПрдХ рд╡реГрдХреНрд╖ рдЧреНрд░рд╛рдлрдЪрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЗрд╕ рдЖрд╣реЗ. рдпреЗрдереЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЭрд╛рдб рдЖрд╣реЗ:

рдмрд╛рдпрдирд░реА рдЯреНрд░реА рдХрд┐рдВрд╡рд╛ рдмрд╛рдпрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рдХрд╕реЗ рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ

рд╣реЗ рдмрд╛рдпрдирд░реА рд╢реЛрдз рд╡реГрдХреНрд╖ рдирд╛рд╣реА! рд╕рд░реНрд╡ рдХрд╛рд╣реА рдХрд╛рдкрд▓реЗ рдЖрд╣реЗ!

рдЯрд░реНрдорд┐рдиреЛрд▓реЙрдЬреА

рд░реВрдЯ

рдЭрд╛рдбрд╛рдЪреЗ рдореВрд│ - рд╣рд╛ рддреНрдпрд╛рдЪрд╛ рд╕рд░реНрд╡рд╛рдд рд╡рд░рдЪрд╛ рдиреЛрдб рдЖрд╣реЗ. рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ, рд╣реЗ рдиреЛрдб A рдЖрд╣реЗ. рдЭрд╛рдбрд╛рдордзреНрдпреЗ, рдлрдХреНрдд рдПрдХ рдорд╛рд░реНрдЧ рд░реВрдЯрдкрд╛рд╕реВрди рдЗрддрд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рдиреЛрдбрдХрдбреЗ рдиреЗрдК рд╢рдХрддреЛ! рдЦрд░рдВ рддрд░, рдХреЛрдгрддреНрдпрд╛рд╣реА рдиреЛрдбрд▓рд╛ рдпрд╛ рдиреЛрдбрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рд╕рдмрдЯреНрд░реАрдЪреЗ рдореВрд│ рдорд╛рдирд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.

рдкрд╛рд▓рдХ/рд╡рдВрд╢рдЬ

рд░реВрдЯ рд╡рдЧрд│рддрд╛ рд╕рд░реНрд╡ рдиреЛрдбреНрд╕рдордзреНрдпреЗ рдЕрдЧрджреА рдПрдХ рдзрд╛рд░ рдЕрд╕рддреЗ рдЬреА рджреБрд╕рд▒реНрдпрд╛ рдиреЛрдбрдкрд░реНрдпрдВрдд рдЬрд╛рддреЗ. рд╡рд░реНрддрдорд╛рди рдПрдХ рд╡рд░ рд╕реНрдерд┐рдд рдиреЛрдб рдореНрд╣рдгрддрд╛рдд рдкрд╛рд▓рдХ рд╣рд╛ рдиреЛрдб. рд╡рд░реНрддрдорд╛рдирд╛рдЪреНрдпрд╛ рдЦрд╛рд▓реА рд╕реНрдерд┐рдд рдЖрдгрд┐ рддреНрдпрд╛рд╕ рдЬреЛрдбрд▓реЗрд▓рд╛ рдиреЛрдб рдореНрд╣рдгрддрд╛рдд рд╡рдВрд╢рдЬ рд╣рд╛ рдиреЛрдб. рдЪрд▓рд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рдкрд░реВ. рдЪрд▓рд╛ рдиреЛрдб рдмреА рдШреЗрдК, рдирдВрддрд░ рддреНрдпрд╛рдЪреЗ рдкрд╛рд▓рдХ рдиреЛрдб A рдЕрд╕реЗрд▓ рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдореБрд▓реЗ D, E рдЖрдгрд┐ F рдиреЛрдб рдЕрд╕рддреАрд▓.

рдкрд╛рди

рдЬреНрдпрд╛ рдиреЛрдбрд▓рд╛ рдореБрд▓реЗ рдирд╛рд╣реАрдд рддреНрдпрд╛рд▓рд╛ рдЭрд╛рдбрд╛рдЪреЗ рдкрд╛рди рдореНрд╣рдЯрд▓реЗ рдЬрд╛рдИрд▓. рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ, рдкрд╛рдиреЗ D, E, F, G, I, J, K рдиреЛрдбреНрд╕ рдЕрд╕рддреАрд▓.

рд╣реА рдореВрд│ рд╢рдмреНрджрд╛рд╡рд▓реА рдЖрд╣реЗ. рдЗрддрд░ рд╕рдВрдХрд▓реНрдкрдирд╛рдВрд╡рд░ рдкреБрдвреЗ рдЪрд░реНрдЪрд╛ рдХреЗрд▓реА рдЬрд╛рдИрд▓. рддрд░, рдмрд╛рдпрдирд░реА рдЯреНрд░реА рд╣реЗ рдПрдХ рдЭрд╛рдб рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдбрд▓рд╛ рджреЛрдирдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдореБрд▓реЗ рдирд╕рддреАрд▓. рддреБрдореНрд╣реА рдЕрдВрджрд╛рдЬ рд▓рд╛рд╡рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рддреАрд▓ рдЭрд╛рдб рдмрд╛рдпрдирд░реА рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА, рдХрд╛рд░рдг рдиреЛрдбреНрд╕ B рдЖрдгрд┐ H рд▓рд╛ рджреЛрдирдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдореБрд▓реЗ рдЖрд╣реЗрдд. рдпреЗрдереЗ рдмрд╛рдпрдирд░реА рдЭрд╛рдбрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ:

рдмрд╛рдпрдирд░реА рдЯреНрд░реА рдХрд┐рдВрд╡рд╛ рдмрд╛рдпрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рдХрд╕реЗ рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ

рдЯреНрд░реА рдиреЛрдбреНрд╕рдордзреНрдпреЗ рдХреЛрдгрддреАрд╣реА рдорд╛рд╣рд┐рддреА рдЕрд╕реВ рд╢рдХрддреЗ. рдмрд╛рдпрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рд╣реЗ рдмрд╛рдпрдирд░реА рдЯреНрд░реА рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдЦрд╛рд▓реАрд▓ рдЧреБрдгрдзрд░реНрдо рдЖрд╣реЗрдд:

  1. рдбрд╛рд╡реЗ рдЖрдгрд┐ рдЙрдЬрд╡реЗ рджреЛрдиреНрд╣реА рдЙрдкрд╡реГрдХреНрд╖ рдмрд╛рдпрдирд░реА рд╢реЛрдз рд╡реГрдХреНрд╖ рдЖрд╣реЗрдд.
  2. рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдиреЛрдб X рдЪреНрдпрд╛ рдбрд╛рд╡реНрдпрд╛ рд╕рдмрдЯреНрд░реАрдЪреНрдпрд╛ рд╕рд░реНрд╡ рдиреЛрдбреНрд╕рдордзреНрдпреЗ рдбреЗрдЯрд╛ рдХреА рдореВрд▓реНрдпреЗ рдиреЛрдб X рдЪреНрдпрд╛ рдбреЗрдЯрд╛ рдХреАрдЪреНрдпрд╛ рдореВрд▓реНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдХрдореА рдЕрд╕рддрд╛рдд.
  3. рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдиреЛрдб 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;

    //╨╝╨╡╤В╨╛╨┤╤Л ╨┤╨╡╤А╨╡╨▓╨░
}

рдЖрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдХреНрд▓рд╛рд╕ рдлреАрд▓реНрдб рдореНрд╣рдгреВрди рдЭрд╛рдбрд╛рдЪреЗ рд░реВрдЯ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдХрд╛рд░рдг рд░реВрдЯ рдкрд╛рд╕реВрди, 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)) рдЕрд╕реЗрд▓, рдЖрдгрд┐ рд▓реЙрдЧрд░рд┐рджрдо рдмреЗрд╕ 2 рдЕрд╕реЗрд▓. рдкрд╣рд╛: рдЬрд░ рд╕рдВрддреБрд▓рд┐рдд рдЭрд╛рдбрд╛рдордзреНрдпреЗ n рдШрдЯрдХ рдЕрд╕рддреАрд▓, рддрд░ рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА рд▓реЙрдЧ(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))

рд╕рдордорд┐рддреАрдп рдмрд╛рдпрдкрд╛рд╕

рдЯреНрд░реЕрд╡реНрд╣рд░реНрд╕рд▓ рдЭрд╛рдбрд╛рдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдбрд▓рд╛ рднреЗрдЯ рджреЗрдд рдЖрд╣реЗ рдЬреЗрдгреЗрдХрд░реБрди рддреНрдпрд╛рд╡рд░ рдХрд╛рд╣реА рдХреГрддреА рдХрд░рд╛.

рдЖрд╡рд░реНрддреА рд╕рдордорд┐рддреАрдп рдЯреНрд░реЕрд╡реНрд╣рд░реНрд╕рд▓ рдЕрд▓реНрдЧреЛрд░рд┐рджрдо:

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

PS

O(n) рдХрдбреЗ рдЕрдз:рдкрддрди

рддреБрдордЪреНрдпрд╛рдкреИрдХреА рдЕрдиреЗрдХрд╛рдВрдиреА рд▓рдХреНрд╖рд╛рдд рдШреЗрддрд▓реЗ рдЕрд╕реЗрд▓: рдЬрд░ рддреБрдореНрд╣реА рдЭрд╛рдб рдЕрд╕рдВрддреБрд▓рд┐рдд рдХреЗрд▓реЗ рддрд░? рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЭрд╛рдбрд╛рдордзреНрдпреЗ рд╡рд╛рдврддреНрдпрд╛ рдХрд│рд╛рдВрд╕рд╣ рдиреЛрдбреНрд╕ рдареЗрд╡рд╛: 1,2,3,4,5,6... рдордЧ рдЭрд╛рдб рдХрд╛рд╣реА рдкреНрд░рдорд╛рдгрд╛рдд рд▓рд┐рдВрдХ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕реВрдЪреАрд╕рд╛рд░рдЦреЗ рджрд┐рд╕реЗрд▓. рдЖрдгрд┐ рд╣реЛрдп, рд╡реГрдХреНрд╖ рддреНрдпрд╛рдЪреНрдпрд╛ рдЭрд╛рдбрд╛рдЪреА рд░рдЪрдирд╛ рдЧрдорд╛рд╡реЗрд▓ рдЖрдгрд┐ рдореНрд╣рдгреВрди рдбреЗрдЯрд╛ рдНрдХреНрд╕реЗрд╕рдЪреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛. рд╢реЛрдз, рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ рд╣рдЯрд╡рдгреЗ рдСрдкрд░реЗрд╢рдиреНрд╕рдЪреА рдЬрдЯрд┐рд▓рддрд╛ рд▓рд┐рдВрдХ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕реВрдЪреАрдкреНрд░рдорд╛рдгреЗрдЪ рд╣реЛрдИрд▓: O(n). рдорд╛рдЭреНрдпрд╛ рдорддреЗ, рдмрд╛рдпрдирд░реА рдЭрд╛рдбрд╛рдВрдЪреЗ рддреЛрдЯреЗ рд╣реЗ рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ.

рдХреЗрд╡рд│ рдиреЛрдВрджрдгреАрдХреГрдд рд╡рд╛рдкрд░рдХрд░реНрддреЗрдЪ рд╕рд░реНрд╡реЗрдХреНрд╖рдгрд╛рдд рднрд╛рдЧ рдШреЗрдК рд╢рдХрддрд╛рдд. рд╕рд╛рдЗрди рдЗрди рдХрд░рд╛, рдЖрдкрд▓реЗ рд╕реНрд╡рд╛рдЧрдд рдЖрд╣реЗ.

рдореА рдЦреВрдк рджрд┐рд╡рд╕рд╛рдВрдкрд╛рд╕реВрди рд╣рдмрд╡рд░ рдирд╛рд╣реА рдЖрдгрд┐ рдорд▓рд╛ рдЬрд╛рдгреВрди рдШреНрдпрд╛рдпрдЪреЗ рдЖрд╣реЗ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЛрдгрддреНрдпрд╛ рд╡рд┐рд╖рдпрд╛рд╡рд░реАрд▓ рд▓реЗрдЦ рдЕрдзрд┐рдХ рдкрд╣рд╛рдпрдЪреЗ рдЖрд╣реЗрдд?

  • рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛

  • рдЕрд▓реНрдЧреЛрд░рд┐рджрдо (рдбреАрдкреА, рдкреБрдирд░рд╛рд╡реГрддреНрддреА, рдбреЗрдЯрд╛ рдХреЙрдореНрдкреНрд░реЗрд╢рди рдЗ.)

  • рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рдирд╛рдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЖрдгрд┐ рдЕрд▓реНрдЧреЛрд░рд┐рджрдордЪрд╛ рд╡рд╛рдкрд░

  • Java рдордзреНрдпреЗ рдЕрдБрдбреНрд░реЙрдЗрдб рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

  • Java рдордзреНрдпреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ

2 рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдиреА рдорддрджрд╛рди рдХреЗрд▓реЗ. 1 рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рджреВрд░ рд░рд╛рд╣рд┐рд▓рд╛.

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛