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

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

рдпрд╣ рд▓реЗрдЦ рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рд╣реИ рд╣рдлрд╝рдореИрди рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рдиред рд╡рд╣рд╛рдВ рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЦреЛрдЬрдиреЗ, рдбрд╛рд▓рдиреЗ, рд╣рдЯрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рдереЗред рдЕрдм рдореИрдВрдиреЗ рдкреЗрдбрд╝реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╢рд╛рдпрдж рд╣рдо рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ.

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

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

рдпрд╣ рдХреЛрдИ рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рдирд╣реАрдВ рд╣реИ! рд╕рдм рдХреБрдЫ рдХрдЯреМрддреА рдХреЗ рдЕрдзреАрди рд╣реИ!

рд╢рдмреНрджрд╛рд╡рд▓реА

рдЬрдбрд╝

рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рд╕рдмрд╕реЗ рдКрдкрд░реА рдиреЛрдб рд╣реИ. рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рдиреЛрдб рдП рд╣реИред рдкреЗрдбрд╝ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рдкрде рдЬрдбрд╝ рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдиреЛрдб рддрдХ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ! рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд┐рд╕реА рднреА рдиреЛрдб рдХреЛ рдЗрд╕ рдиреЛрдб рдХреЗ рдЕрдиреБрд░реВрдк рдЙрдкрдЯреНрд░реА рдХреА рдЬрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдорд╛рддрд╛-рдкрд┐рддрд╛/рд╕рдВрддрд╛рди

рд░реВрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдиреЛрдбреНрд╕ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдХрд┐рдирд╛рд░рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рджреВрд╕рд░реЗ рдиреЛрдб рддрдХ рдЬрд╛рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдиреЛрдб рдХреЗ рдКрдкрд░ рдХреЗ рдиреЛрдб рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдпрд╣ рдиреЛрдб. рд╡рд░реНрддрдорд╛рди рдиреЛрдб рдХреЗ рдиреАрдЪреЗ рд╕реНрдерд┐рдд рдФрд░ рдЙрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рдиреЛрдб рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рдВрд╢рдЬ рдпрд╣ рдиреЛрдб. рдЪрд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреЗ рд╣реИрдВ. рдиреЛрдб рдмреА рд▓реЗрдВ, рддреЛ рдЙрд╕рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдиреЛрдб рдП рд╣реЛрдВрдЧреЗ, рдФрд░ рдЙрд╕рдХреЗ рдмрдЪреНрдЪреЗ рдиреЛрдб рдбреА, рдИ рдФрд░ рдПрдл рд╣реЛрдВрдЧреЗред

рдЪрд╛рджрд░

рдЬрд┐рд╕ рдиреЛрдб рдХреА рдХреЛрдИ рд╕рдВрддрд╛рди рдирд╣реАрдВ рд╣реЛрддреА рдЙрд╕реЗ рдкреЗрдбрд╝ рдХрд╛ рдкрддреНрддрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдиреЛрдб D, E, F, G, I, J, K рдкрддреНрддрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреАред

рдпрд╣ рдореВрд▓ рд╢рдмреНрджрд╛рд╡рд▓реА рд╣реИ. рдЕрдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рддреЛ, рдПрдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдПрдХ рдРрд╕рд╛ рдкреЗрдбрд╝ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдореЗрдВ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдмрдЪреНрдЪреЗ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛, рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкреЗрдбрд╝ рдмрд╛рдЗрдирд░реА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдиреЛрдбреНрд╕ рдмреА рдФрд░ рдПрдЪ рдореЗрдВ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдмрдЪреНрдЪреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

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

рдкреЗрдбрд╝ рдХреЗ рдиреЛрдбреНрд╕ рдореЗрдВ рдХреЛрдИ рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рдПрдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ:

  1. рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рджреЛрдиреЛрдВ рдЙрдкрд╡реГрдХреНрд╖ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЦреЛрдЬ рд╡реГрдХреНрд╖ рд╣реИрдВред
  2. рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдиреЛрдб рдПрдХреНрд╕ рдХреЗ рдмрд╛рдПрдВ рдЙрдкрдЯреНрд░реА рдХреЗ рд╕рднреА рдиреЛрдбреНрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХреБрдВрдЬреА рдорд╛рди рдиреЛрдб рдПрдХреНрд╕ рдХреЗ рдбреЗрдЯрд╛ рдХреБрдВрдЬреА рдорд╛рди рд╕реЗ рдХрдо рд╣реИред
  3. рдПрдХ рдордирдорд╛рдирд╛ рдиреЛрдб

рдХреБрдВрдЬреА - рдиреЛрдб рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдЦреНрдпрд╛)ред рдкреЗрдбрд╝ рдХреЗ рдЙрд╕ рддрддреНрд╡ рдХреЛ рдвреВрдВрдврдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдХреБрдВрдЬреА рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рдЙрджрд╛рд╣рд░рдг:

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

рдЯреНрд░реА рд╡реНрдпреВ

рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдореИрдВ рдЖрдЧреЗ рдмрдврд╝реВрдВрдЧрд╛, рдЖрдкрдХреА рд╕рдордЭ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреЛрдб рдХреЗ рдХреБрдЫ (рд╢рд╛рдпрдж рдЕрдзреВрд░реЗ) рдЯреБрдХрдбрд╝реЗ рд╢рд╛рдорд┐рд▓ рдХрд░реВрдВрдЧрд╛ред рдкреВрд░рд╛ рдХреЛрдб рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реЛрдЧрд╛.

рдкреЗрдбрд╝ рдЧрд╛рдВрдареЛрдВ рд╕реЗ рдмрдирд╛ рд╣реЛрддрд╛ рд╣реИред рдиреЛрдб рд╕рдВрд░рдЪрдирд╛:

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 рддрддреНрд╡ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреЗрдбрд╝ рдХреЗ рдЖрдзрд╛рд░ 2 рд╕реНрддрд░ рд▓реЙрдЧ (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;
                    }
                }
            }
        }
    }

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рдиреЛрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд░реНрддрдорд╛рди рдиреЛрдб рдХреЗ рдореВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЬрдм рдХрд░рдВрдЯ рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореВрд▓ рдЪрд░ рдореЗрдВ рд╡рд╣ рд╢реАрдЯ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреА рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рджрдХреНрд╖рддрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЦреЛрдЬ рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧреА - O(log(n))ред

рдирд┐рд╖реНрдХрд╛рд╕рди

рд╣рдЯрд╛рдирд╛ рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕ рддрддреНрд╡ рдХреЛ рдвреВрдВрдврдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдо рд╣рдЯрд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдХреНрдпрд╛? рдпрджрд┐ рд╣рдо рдЗрд╕рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрд╕ рдЙрдкрд╡реГрдХреНрд╖ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛ рджреЗрдВрдЧреЗ рдЬрд┐рд╕рдХрд╛ рдореВрд▓ рдпрд╣ рдиреЛрдб рд╣реИред рдкреЗрдбрд╝ рд╣рдЯрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рддреАрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд╣рд▓рд╛ рдорд╛рдорд▓рд╛. рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдб рдХреА рдХреЛрдИ рд╕рдВрддрд╛рди рдирд╣реАрдВ рд╣реИ.

рдпрджрд┐ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдб рдореЗрдВ рдХреЛрдИ рд╕рдВрддрд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкрддреНрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдк рдмрд╕ рдЗрд╕рдХреЗ рдкреИрд░реЗрдВрдЯ рдХреЗ рдмрд╛рдПрдБ рдмрдЪреНрдЪреЗ рдпрд╛ рджрд╛рдПрдБ рдмрдЪреНрдЪреЗ рдлрд╝реАрд▓реНрдб рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рджреВрд╕рд░рд╛ рдорд╛рдорд▓рд╛. рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдб рдореЗрдВ рдПрдХ рдмрдЪреНрдЪрд╛ рд╣реИ

рдпреЗ рдорд╛рдорд▓рд╛ рднреА рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ. рдЖрдЗрдП рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдБред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдХреБрдВрдЬреА 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(рд▓реЙрдЧ(n))

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

рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХрд╛ рджреМрд░рд╛ рд╣реИред

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

  1. рдмрд╛рдПрдВ рдмрдЪреНрдЪреЗ рдкрд░ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВ
  2. рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдПрдХ рдХрд╛рд░реНрдп рдХрд░реЗрдВ
  3. рд╕рд╣реА рдмрдЪреНрдЪреЗ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░реЗрдВ

рдХреЛрдб:

    public void inOrder(Node<T> current) {
        if (current != null) {
            inOrder(current.getLeftChild());
            System.out.println(current.getData() + " ");//╨Ч╨┤╨╡╤Б╤М ╨╝╨╛╨╢╨╡╤В ╨▒╤Л╤В╤М ╨▓╤Б╨╡, ╤З╤В╨╛ ╤Г╨│╨╛╨┤╨╜╨╛
            inOrder(current.getRightChild());
        }
    }

рдирд┐рд╖реНрдХрд░реНрд╖

рдЕрдВрдд рдореЗрдВ! рдпрджрд┐ рдореИрдВрдиреЗ рдХреБрдЫ рд╕рдордЭрд╛рдпрд╛ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣рд╛рдБ рдкреВрд░рд╛ рдХреЛрдб рд╣реИред

рдиреЛрдб.рдЬрд╛рд╡рд╛:

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

рдмрд╛рдЗрдирд░реАрдЯреНрд░реА.рдЬрд╛рд╡рд╛:

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

рдкреБрдирд╢реНрдЪ

O(n) рдореЗрдВ рдЕрдз:рдкрддрди

рдЖрдк рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛: рдпрджрд┐ рдЖрдк рдкреЗрдбрд╝ рдХреЛ рдЕрд╕рдВрддреБрд▓рд┐рдд рдХрд░ рджреЗрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдврд╝рддреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреЗрдбрд╝ рдореЗрдВ рдиреЛрдбреНрд╕ рдбрд╛рд▓реЗрдВ: 1,2,3,4,5,6... рдлрд┐рд░ рдкреЗрдбрд╝ рдХреБрдЫ рд╣рдж рддрдХ рдПрдХ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рдПрдЧрд╛ред рдФрд░ рд╣рд╛рдБ, рдкреЗрдбрд╝ рдЕрдкрдиреА рд╡реГрдХреНрд╖ рд╕рдВрд░рдЪрдирд╛ рдЦреЛ рджреЗрдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдХреА рджрдХреНрд╖рддрд╛ рднреАред рдЦреЛрдЬ, рд╕рдореНрдорд┐рд▓рди рдФрд░ рд╡рд┐рд▓реЛрдкрди рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреЗ рд╕рдорд╛рди рд╣реЛ рдЬрд╛рдПрдЧреА: O(n)ред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреБрдХрд╕рд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

рдХреЗрд╡рд▓ рдкрдВрдЬреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реА рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдореЗрдВ рднрд╛рдЧ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВрдХреГрдкрдпрд╛ред

рдореИрдВ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рд╣реИрдмреЗ рдкрд░ рдирд╣реАрдВ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдХрд┐рди рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рдХреМрди рд╕реЗ рд▓реЗрдЦ рдЕрдзрд┐рдХ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?

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

  • рдПрд▓реНрдЧреЛрд░рд┐рджрдо (рдбреАрдкреА, рд░рд┐рдХрд░реНрд╕рди, рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рди, рдЖрджрд┐)

  • рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ

  • рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

  • рдЬрд╛рд╡рд╛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

2 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рдорддрджрд╛рди рдХрд┐рдпрд╛ред 1 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рднрд╛рдЧ рд▓рд┐рдпрд╛ред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ