рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рд╡рд╛ рдмрд╛рдЗрдирд░реА рдЦреЛрдЬ рд░реВрдЦ рдХрд╕рд░реА рддрдпрд╛рд░ рдЧрд░реНрдиреЗ

Prelude

рдпреЛ рд▓реЗрдЦ рдмрд╛рдЗрдирд░реА рдЦреЛрдЬ рд░реВрдЦрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рд╣реЛред рдореИрд▓реЗ рднрд░реНрдЦрд░реИ рдмрд╛рд░реЗрдорд╛ рдПрдЙрдЯрд╛ рд▓реЗрдЦ рдЧрд░реЗрдВ Huffman рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдбрд╛рдЯрд╛ рд╕рдЩреНрдХреБрдЪрдиред рддреНрдпрд╣рд╛рдБ рдореИрд▓реЗ рдмрд╛рдЗрдирд░реА рд░реВрдЦрд╣рд░реВрдорд╛ рдзреЗрд░реИ рдзреНрдпрд╛рди рджрд┐рдПрди, рдХрд┐рдирднрдиреЗ рдЦреЛрдЬ, рд╕рдореНрдорд┐рд▓рди, рд░ рдореЗрдЯрд╛рдЙрдиреЗ рд╡рд┐рдзрд┐рд╣рд░реВ рд╕рд╛рдиреНрджрд░реНрднрд┐рдХ рдерд┐рдПрдирдиреНред рдЕрдм рдореИрд▓реЗ рд░реВрдЦрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рд▓реЗрдЦ рд▓реЗрдЦреНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВред рд╕реБрд░реБ рдЧрд░реМрдВред

рдПрдХ рд░реВрдЦ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реЛ рдЬрд╕рдорд╛ рдХрд┐рдирд╛рд░рд╣рд░реВ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд┐рдПрдХрд╛ рдиреЛрдбрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рд╣реБрдиреНрдЫрдиреНред рд╣рд╛рдореА рднрдиреНрди рд╕рдХреНрдЫреМрдВ рдХрд┐ рд░реВрдЦ рдЧреНрд░рд╛рдлрдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЗрд╕ рд╣реЛред рдпрд╣рд╛рдБ рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рд░реВрдЦ рдЫ:

рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рд╡рд╛ рдмрд╛рдЗрдирд░реА рдЦреЛрдЬ рд░реВрдЦ рдХрд╕рд░реА рддрдпрд╛рд░ рдЧрд░реНрдиреЗ

рдпреЛ рдмрд╛рдЗрдирд░реА рдЦреЛрдЬ рд░реВрдЦ рд╣реЛрдЗрди! рд╕рдмреИ рдХрд╛рдЯрд┐рдПрдХреЛ рдЫ!

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

рд░реВрдЯ

рд░реБрдЦрдХреЛ рдЬрд░рд╛ - рдпреЛ рдпрд╕рдХреЛ рд╢реАрд░реНрд╖ рдиреЛрдб рд╣реЛред рдЙрджрд╛рд╣рд░рдгрдорд╛, рдпреЛ рдиреЛрдб рдП рд╣реЛред рд░реВрдЦрдорд╛, рдПрдЙрдЯрд╛ рдорд╛рддреНрд░ рдмрд╛рдЯреЛрд▓реЗ рд░реВрдЯрдмрд╛рдЯ рдЕрд░реНрдХреЛ рдиреЛрдбрдорд╛ рд▓реИрдЬрд╛рди рд╕рдХреНрдЫ! рд╡рд╛рд╕реНрддрд╡рдорд╛, рдХреБрдиреИ рдкрдирд┐ рдиреЛрдбрд▓рд╛рдИ рдпрд╕ рдиреЛрдбрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рд╕рдмрдЯреНрд░реАрдХреЛ рдореВрд▓рдХреЛ рд░реВрдкрдорд╛ рдорд╛рдиреНрди рд╕рдХрд┐рдиреНрдЫред

рдЖрдорд╛рдмрд╛рдмреБ / рд╕рдиреНрддрд╛рди

рд░реВрдЯ рдмрд╛рд╣реЗрдХ рд╕рдмреИ рдиреЛрдбрд╣рд░реВрдорд╛ рдЕрд░реНрдХреЛ рдиреЛрдбрдорд╛ рдкреБрдЧреНрдиреЗ рдПрдЙрдЯрд╛ рдХрд┐рдирд╛рд░рд╛ рд╣реБрдиреНрдЫред рд╣рд╛рд▓рдХреЛ рдорд╛рдерд┐ рд░рд╣реЗрдХреЛ рдиреЛрдбрд▓рд╛рдИ рднрдирд┐рдиреНрдЫ рдЕрднрд┐рднрд╛рд╡рдХ рдпреЛ рдиреЛрдбред рд╣рд╛рд▓рдХреЛ рдПрдХ рдореБрдирд┐ рд╕реНрдерд┐рдд рдиреЛрдб рд░ рдпрд╕рд▓рд╛рдИ рдЬрдбрд╛рди рднрдирд┐рдиреНрдЫ рд╡рдВрд╢рдЬ рдпреЛ рдиреЛрдбред рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВред рдиреЛрдб B рд▓рд┐рдиреБрд╣реЛрд╕реН, рддреНрдпрд╕рдкрдЫрд┐ рдпрд╕рдХреЛ рдЕрднрд┐рднрд╛рд╡рдХ рдиреЛрдб 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;
    }
//...╨╛╤Б╤В╨░╨╗╤М╨╜╤Л╨╡ ╨╝╨╡╤В╨╛╨┤╤Л ╤Г╨╖╨╗╨░
}

рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдбрдорд╛ рджреБрдИ рдмрдЪреНрдЪрд╛рд╣рд░реВ рдЫрдиреН (рдпреЛ рдПрдХрджрдо рд╕рдореНрднрд╡ рдЫ рдХрд┐ 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))

рд╕рдордорд┐рдд рдмрд╛рдЗрдкрд╛рд╕

рдЯреНрд░рд╛рднрд░реНрд╕рд▓рд▓реЗ рд░реВрдЦрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рднреНрд░рдордг рдЧрд░реНрджреИрдЫ рдпрд╕рдХреЛ рд╕рд╛рде рдХреЗрд╣рд┐ рдХрд╛рд░реНрдп рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ред

рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕рдордорд┐рдд рдЯреНрд░рд╡рд░реНрд╕рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо:

  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 рдорд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ

2 рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдорддрджрд╛рди рдЧрд░реЗред рез рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд░реЛрдХрд┐рдПред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди