рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝

рдпрджрд┐ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯреЛрдВ рдореЗрдВ рдпрд╣ рд╕рдВрддреБрд▓рд┐рдд рдЦреЛрдЬ рдкреЗрдбрд╝реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдлреА рдЖрдзреБрдирд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдерд╛, рддреЛ рдпрд╣ рдкреЛрд╕реНрдЯ AVL рдкреЗрдбрд╝реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ - рд╢рд╛рдпрдж 1962 рдореЗрдВ рд╣рдорд╛рд░реЗ (рддрдм рд╕реЛрд╡рд┐рдпрдд) рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╕рдВрддреБрд▓рд┐рдд рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЦреЛрдЬ рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдкрд╣рд▓рд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ред -рд╡реЗрд▓реНрд╕реНрдХреА рдФрд░ рд▓реИрдВрдбрд┐рд╕ред рдЖрдк рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝реЛрдВ рдХреЗ рдХрдИ рдЕрд╣рд╕рд╛рд╕ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ ), рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рднреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рджреЗрдЦрд╛, рд╡рд╣ рдмрд╣реБрдд рдЖрд╢рд╛рд╡рд╛рдж рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк рд╕рдм рдХреБрдЫ рдЦрд░реЛрдВрдЪ рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рд░ рдЬрдЧрд╣ рдпрд╣ рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝ рд▓рд╛рд▓-рдХрд╛рд▓реЗ рдкреЗрдбрд╝реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓ рд╣реЛрддреЗ рд╣реИрдВ , рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рдХреЛрдб рдХреЛ рджреЗрдЦрдХрд░, рдЖрдкрдХреЛ рдЗрд╕ рдХрдерди рдкрд░ рд╕рдВрджреЗрд╣ рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝реЛрдВ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░реЗрд░рдгрд╛ рдереАред рдкреНрд░рд╕реНрддреБрддрд┐ C ++ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕рдЪрд┐рддреНрд░ рд╣реИред



рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛


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

рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд░реНрдереЛрдВ рдореЗрдВ рд╕рдВрддреБрд▓рд┐рдд рд╣реИ: рдХрд┐рд╕реА рднреА рдкреЗрдбрд╝ рдХреЗ рдиреЛрдб рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рджрд╛рдПрдВ рдЙрдк-рд╡рд░реНрдЧ рдХреА рдКрдБрдЪрд╛рдИ рдмрд╛рдИрдВ рд╕рдмрдЯреНрд░реА рдХреА рдКрдВрдЪрд╛рдИ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИ рдЬреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ ред рдпрд╣ рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдкреЗрдбрд╝ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ: рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝ рдХреА рдКрдБрдЪрд╛рдИ рдПрдЪ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде n рдХреА рд╕реАрдорд╛ 2 рд▓реЙрдЧ (n + 1) рд╕реЗ рд▓реЗрдХрд░ 1.44 рд▓реЙрдЧ 2 (n + 2) - 0.328 рддрдХ рд╣реИред рдФрд░ рдЪреВрдВрдХрд┐ рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА (рдиреЛрдбреНрд╕ рдХреА рдЦреЛрдЬ, рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдФрд░ рд╡рд┐рд▓реЛрдкрди) рдкрд░ рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрдЪрд╛рд▓рди рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рдКрдВрдЪрд╛рдИ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рдордп рдХреА рдПрдХ рдЧрд╛рд░рдВрдЯреАрдХреГрдд рд▓реЙрдЧрд░рд┐рджрдорд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдкреЗрдбрд╝ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдЪрд╛рдмрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЦреЛрдЬ рд╡рд╛рд▓реЗ рдкреЗрдбрд╝ рдХреЗрд╡рд▓ рд╕рдВрднрд╛рд╡реНрдп рдЕрд░реНрдереЛрдВ рдореЗрдВ рд╕рдВрддреБрд▓рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ: рдмрдбрд╝реЗ n рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рдЕрд╕рдВрддреБрд▓рд┐рдд рд╡реГрдХреНрд╖ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдирдЧрдгреНрдп рд╣реИ, рдЧреИрд░-рд╢реВрдиреНрдп рд░рд╣рддрд╛ рд╣реИ ред

рдиреЛрдб рд╕рдВрд░рдЪрдирд╛


рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде AVL рдкреЗрдбрд╝ рдХреЗ рдиреЛрдбреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдВрдЧреЗ:

struct node //      { int key; unsigned char height; node* left; node* right; node(int k) { key = k; left = right = 0; height = 1; } }; 

рдореБрдЦреНрдп рдлрд╝реАрд▓реНрдб рдиреЛрдб рдХреБрдВрдЬреА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдКрдВрдЪрд╛рдИ рдлрд╝реАрд▓реНрдб рджреА рдЧрдИ рдиреЛрдб рдореЗрдВ рд░реВрдЯ рдХреЗ рд╕рд╛рде рд╕рдмрдЯреНрд░реА рдХреА рдКрдВрдЪрд╛рдИ рд╣реИ, рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдлрд╝реАрд▓реНрдб рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдЙрдкрд╢реАрд░реНрд╖рдХ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рд╣реИрдВред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рджрд┐рдП рдЧрдП рдХреБрдВрдЬреА k рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдиреЛрдб (рдКрдВрдЪрд╛рдИ 1) рдмрдирд╛рддрд╛ рд╣реИред

рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ, рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝ рдХреЗ рдиреЛрдбреНрд╕ рдКрдВрдЪрд╛рдИ рдХреЛ рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджрд╛рдПрдВ рдФрд░ рдмрд╛рдПрдВ рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ (рддрдерд╛рдХрдерд┐рдд рд╕рдВрддреБрд▓рди рдХрд╛рд░рдХ) рдХреА рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдореЗрдВ рдЕрдВрддрд░, рдЬреЛ рдХреЗрд╡рд▓ рддреАрди рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ -1, 0 рдФрд░ 1. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдЕрдВрддрд░ рдЕрднреА рднреА рдПрдХ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рдЗрдЯ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА "рдкреНрд░рднрд╛рд╡реА" рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХреА рдХреБрдЫ рдореБрд╢реНрдХрд┐рд▓ рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ)ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдКрдВрдЪрд╛рдИ h <1.44 рд▓реЙрдЧ 2 (n + 2), рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐ n = 10 9 (рдПрдХ рдмрд┐рд▓рд┐рдпрди рдХреБрдВрдЬреА, рдиреЛрдбреНрд╕ рдХреЛ рд╕рдВрдЪрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 10 рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рд╕реЗ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА) рдХреЗ рд▓рд┐рдП рдкреЗрдбрд╝ рдХреА рдКрдВрдЪрд╛рдИ = 44 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЬреЛ рд╕рдВрддреБрд▓рди рдХрд╛рд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдореГрддрд┐ рдХреЗ рдПрдХ рд╣реА рдмрд╛рдЗрдЯ рдореЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд░рдЦрд╛ рдЧрдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рддрд░рдл рд╣рд╛рдЗрдЯреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рд╕реЗ рдЯреНрд░реА рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рддрд░рдл рдХреБрдЫ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред

рд╣рдо рдКрдВрдЪрд╛рдИ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рддреАрди рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реА рдКрдВрдЪрд╛рдИ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реИ, рдпрд╣ рдЕрд╢рдХреНрдд рдмрд┐рдВрджреБрдУрдВ (рдЦрд╛рд▓реА рдкреЗрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

 unsigned char height(node* p) { return p?p->height:0; } 

рджреВрд╕рд░рд╛ рджрд┐рдП рдЧрдП рдиреЛрдб рдХреЗ рд╕рдВрддреБрд▓рди рдХрд╛рд░рдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдХреЗрд╡рд▓ рдЧреИрд░-рд╢реВрдиреНрдп рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ):

 int bfactor(node* p) { return height(p->right)-height(p->left); } 

рддреАрд╕рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рджрд┐рдП рдЧрдП рдиреЛрдб рдХреЗ рдКрдВрдЪрд╛рдИ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╣реА рдореВрд▓реНрдп рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдмрд╢рд░реНрддреЗ рдХрд┐ рджрд╛рдПрдВ рдФрд░ рдмрд╛рдПрдВ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдореЗрдВ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдореВрд▓реНрдп рд╕рд╣реА рд╣реИрдВ):

 void fixheight(node* p) { unsigned char hl = height(p->left); unsigned char hr = height(p->right); p->height = (hl>hr?hl:hr)+1; } 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рднреА рддреАрди рдХрд╛рд░реНрдп рдЧреИрд░-рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЙрдирдХрд╛ рдкрд░рд┐рдЪрд╛рд▓рди рд╕рдордп O (1) рдХрд╛ рдорд╛рди рд╣реИред

рдиреЛрдб рд╕рдВрддреБрд▓рди


рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝ рдореЗрдВ рдиреЛрдбреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдПрдХ рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдХреБрдЫ рдиреЛрдбреНрд╕ рдХрд╛ рд╕рдВрддреБрд▓рди рдХрд╛рд░рдХ 2 рдпрд╛ -2 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЕрд╕рдВрддреБрд▓рди рд╣реИ ред рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдкреЗрдбрд╝ рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкреНрд░рд╕рд┐рджреНрдз рдШреБрдорд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рджрд╛рдПрдВ (рдмрд╛рдПрдВ) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореЛрдбрд╝ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреЗрдбрд╝ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ:



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

 node* rotateright(node* p) //    p { node* q = p->left; p->left = q->right; q->right = p; fixheight(p); fixheight(q); return q; } 

рдмрд╛рдИрдВ рдУрд░ рджрд╛рдИрдВ рдУрд░ рд╕рдордорд┐рдд рдкреНрд░рддрд┐ рд╣реИ:

 node* rotateleft(node* q) //    q { node* p = q->right; q->right = p->left; p->left = q; fixheight(q); fixheight(p); return p; } 

рдЖрдЗрдП рдЕрдм рдПрдХ рдЕрд╕рдВрддреБрд▓рди рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрдм рдиреЛрдб рдкреА рдХреЗ рджрд╛рд╣рд┐рдиреЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреА рдКрдВрдЪрд╛рдИ рдмрд╛рдПрдВ рдЙрдкрд░реА рдХреА рдКрдВрдЪрд╛рдИ рд╕реЗ 2 рдЕрдзрд┐рдХ рд╣реИ (рд╡рд┐рдкрд░реАрдд рдорд╛рдорд▓рд╛ рд╕рдордорд┐рдд рд╣реИ рдФрд░ рдЗрд╕реА рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдмрддрд╛ рджреЗрдВ рдХрд┐ q рдиреЛрдб рдиреЛрдб рдХрд╛ рджрд╛рдпрд╛рдВ рдмрдЪреНрдЪрд╛ рд╣реИ рдФрд░ рдиреЛрдб q рдХреЗ рдмрд╛рдПрдВ рдмрдЪреНрдЪреЗ рдХрд╛ рдирд╛рдо рд╣реИред



рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рдорд▓реЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдиреЛрдб рдкреА рдореЗрдВ рдЕрд╕рдВрддреБрд▓рди рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрд╛рдПрдВ рдореЛрдбрд╝ рдпрд╛ рдПрдХ рд╣реА рдкреА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рддрдерд╛рдХрдерд┐рдд рдмрдбрд╝реЗ рдмрд╛рдПрдВ рдореЛрдбрд╝ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдШреБрдорд╛рд╡ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдмрд╢рд░реНрддреЗ рдХрд┐ рдиреЛрдб q рдХреЗ рдмрд╛рдПрдБ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреА рдКрдБрдЪрд╛рдИ рдЙрд╕рдХреА рджрд╛рдИрдВ рдЙрдкрд░реА рдХреА рдКрдБрдЪрд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ: h (s) (h (D)ред



рд╣рд╛рд▓рдд рдПрдЪ (рдПрд╕)> рдПрдЪ (рдбреА) рдХреЗ рддрд╣рдд рдПрдХ рдмрдбрд╝рд╛ рд░реЛрдЯреЗрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рджреЛ рд╕рд░рд▓ рд▓реЛрдЧреЛрдВ рдореЗрдВ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдкрд╣рд▓реЗ, рдХреНрдпреВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд╕рд╣реА рд░реЛрдЯреЗрд╢рди рдФрд░ рдлрд┐рд░ рдкреА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдмрд╛рдПрдВ рд░реЛрдЯреЗрд╢рдиред



рд╕рдВрддреБрд▓рди рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдФрд░ рдореЛрдбрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ:

 node* balance(node* p) //   p { fixheight(p); if( bfactor(p)==2 ) { if( bfactor(p->right) < 0 ) p->right = rotateright(p->right); return rotateleft(p); } if( bfactor(p)==-2 ) { if( bfactor(p->left) > 0 ) p->left = rotateleft(p->left); return rotateright(p); } return p; //    } 

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

рдореБрдЦреНрдп рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


рдирдИ рдХреБрдВрдЬреА рдХреЛ AVL рдЯреНрд░реА рдореЗрдВ, рдмрдбрд╝реЗ рдФрд░ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╕рд░рд▓ рдЦреЛрдЬ рдкреЗрдбрд╝реЛрдВ рдореЗрдВ: рд╣рдо рд╡рд░реНрддрдорд╛рди рдиреЛрдб рдореЗрдВ рдХреБрдВрдЬреА рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдФрд░ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдВрдЬреА рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдВрджреЛрд▓рди рдХреА рджрд╛рдИрдВ рдпрд╛ рдмрд╛рдИрдВ рджрд┐рд╢рд╛ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реБрдП рдкреЗрдбрд╝ рдХреЗ рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рд░рд┐рдХрд░реНрд╕рди рд╕реЗ рд▓реМрдЯрддреЗ рд╣реИрдВ (рдпрд╛рдиреА, рдХреБрдВрдЬреА рдХреЛ рджрд╛рдПрдВ рдпрд╛ рдмрд╛рдПрдВ рд╕рдмрдЯреНрд░реА рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкреЗрдбрд╝ рд╕рдВрддреБрд▓рд┐рдд рд╣реИ), рддреЛ рд╡рд░реНрддрдорд╛рди рдиреЛрдб рд╕рдВрддреБрд▓рд┐рдд рд╣реИред рдпрд╣ рдХрдбрд╝рд╛рдИ рд╕реЗ рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдкрде рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдиреЛрдб рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдореНрдорд┐рд▓рди рд╕реЗ рдЙрддреНрдкрдиреНрди рдЕрд╕рдВрддреБрд▓рди рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдВрддреБрд▓рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЖрд╡реЗрджрди рд╕рд╣реА рд╣реИред

 node* insert(node* p, int k) //   k     p { if( !p ) return new node(k); if( k<p->key ) p->left = insert(p->left,k); else p->right = insert(p->right,k); return balance(p); } 

рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝реЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рд▓рд┐рдП рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЕрдиреБрдорд╛рдиреЛрдВ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╕рдореНрдорд┐рд▓рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░рд▓ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рд╕рд░рдгреА рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдерд┐рдд рд╕рдВрдЦреНрдпрд╛рдУрдВ рд╕реЗ 1 рд╕реЗ 10,000 рддрдХ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдлрд┐рд░ рдЗрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдореЗрдВ рдЦрд╛рд▓реА AVL рдкреЗрдбрд╝ рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореНрдорд┐рд▓рди рдХреЗ рдмрд╛рдж рдкреЗрдбрд╝ рдХреА рдКрдВрдЪрд╛рдИ рдХреЛ рдорд╛рдкрд╛ рдЧрдпрд╛ред рдкрд░рд┐рдгрд╛рдо 1000 рд╕реЗ рдЕрдзрд┐рдХ рдЧрдгрдирд╛рдУрдВ рдореЗрдВ рдФрд╕рдд рдереЗред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреНрд░рд╛рдл рдФрд╕рдд рдКрдВрдЪрд╛рдИ (рд▓рд╛рд▓ рд░реЗрдЦрд╛) рдХреЗ рдПрди рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ; рдиреНрдпреВрдирддрдо рдКрдВрдЪрд╛рдИ (рд╣рд░реА рд░реЗрдЦрд╛); рдЕрдзрд┐рдХрддрдо рдКрдВрдЪрд╛рдИ (рдиреАрд▓реА рд░реЗрдЦрд╛)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдКрдкрд░реА рдФрд░ рдирд┐рдЪрд▓реЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЕрдиреБрдорд╛рди рджрд┐рдЦрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред



рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд░реВрдк рд╕реЗ рдкрд╛рдИ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдКрдВрдЪрд╛рдЗрдпрд╛рдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдорд╛рд░реНрдЬрд┐рди рдХреЗ рд╕рд╛рде рднреА рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд╕реАрдорд╛рдУрдВ рдореЗрдВ рдЖрддреА рд╣реИрдВред рдпрджрд┐ рдореВрд▓ рдХреБрдВрдЬреА рдЕрдиреБрдХреНрд░рдо рдЖрд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдирд┐рдЪрд▓реА рд╕реАрдорд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддреА рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░)ред

рдХреБрдВрдЬреА рдирд┐рдХрд╛рд▓рдирд╛


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

рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдХрдИ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдЧрд░ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдиреЛрдб рдкреА рдореЗрдВ рдПрдХ рд╕рд╣реА рдЙрдкрдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдмрд╛рдИрдВ рдУрд░ рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рджреНрд╡рд╛рд░рд╛, рдЗрд╕ рдиреЛрдб рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдмрдЪреНрдЪрд╛ рдиреЛрдб (рдКрдВрдЪрд╛рдИ 1 рдХрд╛ рдкреЗрдбрд╝) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдиреЛрдб рдкреА рдПрдХ рдкрддреНрддреА рд╣реИред рдЗрди рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдиреЛрдб рдкреА рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдиреЛрдб рдкреА рдХреЗ рдмрд╛рдПрдВ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдб рдХреЛ рдкреЙрдЗрдВрдЯрд░ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

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

 node* findmin(node* p) //        p { return p->left?findmin(p->left):p; } 

рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдп рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреЗрдбрд╝ рд╕реЗ рдиреНрдпреВрдирддрдо рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ред рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝ рдХреА рд╕рдВрдкрддреНрддрд┐ рджреНрд╡рд╛рд░рд╛, рдлрд┐рд░ рд╕реЗ рджрд╛рдИрдВ рдУрд░ рдиреНрдпреВрдирддрдо рддрддреНрд╡ рдпрд╛ рддреЛ рдПрдХ рдиреЛрдб рдирд┐рд▓рдВрдмрд┐рдд рд╣реИ рдпрд╛ рд╡рд╣рд╛рдВ рдЦрд╛рд▓реА рд╣реИред рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рджрд╛рдПрдВ рдиреЛрдб рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдкрд░ (рдЬрдм рд░рд┐рдХрд░реНрд╕рди рд╕реЗ рд▓реМрдЯрддреЗ рд╕рдордп) рдмреИрд▓реЗрдВрд╕рд┐рдВрдЧ рдХрд░рдирд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо рдиреЛрдб рдХреЛ рд╣реА рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЕрднреА рднреА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред

 node* removemin(node* p) //        p { if( p->left==0 ) return p->right; p->left = removemin(p->left); return balance(p); } 

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

 node* remove(node* p, int k) //   k   p { if( !p ) return 0; if( k < p->key ) p->left = remove(p->left,k); else if( k > p->key ) p->right = remove(p->right,k); 

рдПрдХ рдмрд╛рд░ рдХреБрдВрдЬреА k рдорд┐рд▓ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, B рдкрд░ рдЬрд╛рдПрдВ: рдиреЛрдб p рдХреЗ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдЙрдк-рд╡рд░реНрдЧ рдХреА рдЬрдбрд╝реЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ; рдиреЛрдб рдкреА рд╣рдЯрд╛рдПрдВ; рдпрджрд┐ рд╕рд╣реА рд╕рдмрдЯреНрд░реА рдЦрд╛рд▓реА рд╣реИ, рддреЛ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдмрд╛рдИрдВ рд╕рдмрдЯреНрд░реА рдкрд░ рд▓реМрдЯрд╛ рджреЗрдВ; рдпрджрд┐ рд╕рд╣реА рд╕рдмрдЯреНрд░реА рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рд╡рд╣рд╛рдВ рдиреНрдпреВрдирддрдо рддрддреНрд╡ рдорд┐рдирдЯ рдкрд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, q рдХреЛ рдмрд╛рдПрдВ рд╕реЗ рдорд┐рдирдЯ рддрдХ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ, рдФрд░ r рд╕реЗ рджрд╛рдИрдВ рдУрд░ рдХреНрдпрд╛ рдирд┐рдХрд▓рд╛, рдЗрд╕реЗ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдорд┐рдирдЯ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред

  else // k == p->key { node* q = p->left; node* r = p->right; delete p; if( !r ) return q; node* min = findmin(r); min->right = removemin(r); min->left = q; return balance(min); } 

рдЬрдм рдЖрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрддреБрд▓рди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:

  return balance(p); } 

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

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рд╣рдЯрд╛рдПрдВ рдСрдкрд░реЗрд╢рди (рд╕рд╛рде рд╣реА рд╕рд░рд▓ рдЦреЛрдЬ рдСрдкрд░реЗрд╢рди) рдХреЛ рдкреЗрдбрд╝ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдЖрдиреБрдкрд╛рддрд┐рдХ рд╕рдордп рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдиреЛрдб рдХреЗ рдореВрд▓ рд╕реЗ рдПрдХ рд╡рдВрд╢ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдкрд░ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдПрд╡реАрдПрд▓ рдкреЗрдбрд╝ рд╕рдВрддреБрд▓рд┐рдд рд╣реИ, рдЗрд╕рдХреА рдКрдВрдЪрд╛рдИ рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд▓рдШреБ рд░реВрдк рд╕реЗ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рднреА рддреАрди рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп рдкреЗрдбрд╝ рдХреЗ рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд▓рдШреБ рд░реВрдк рд╕реЗ рдирд┐рд░реНрднрд░ рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!

рдкреВрд░рд╛ рдХреЛрдб
 struct node //      { int key; unsigned char height; node* left; node* right; node(int k) { key = k; left = right = 0; height = 1; } }; unsigned char height(node* p) { return p?p->height:0; } int bfactor(node* p) { return height(p->right)-height(p->left); } void fixheight(node* p) { unsigned char hl = height(p->left); unsigned char hr = height(p->right); p->height = (hl>hr?hl:hr)+1; } node* rotateright(node* p) //    p { node* q = p->left; p->left = q->right; q->right = p; fixheight(p); fixheight(q); return q; } node* rotateleft(node* q) //    q { node* p = q->right; q->right = p->left; p->left = q; fixheight(q); fixheight(p); return p; } node* balance(node* p) //   p { fixheight(p); if( bfactor(p)==2 ) { if( bfactor(p->right) < 0 ) p->right = rotateright(p->right); return rotateleft(p); } if( bfactor(p)==-2 ) { if( bfactor(p->left) > 0 ) p->left = rotateleft(p->left); return rotateright(p); } return p; //    } node* insert(node* p, int k) //   k     p { if( !p ) return new node(k); if( k<p->key ) p->left = insert(p->left,k); else p->right = insert(p->right,k); return balance(p); } node* findmin(node* p) //        p { return p->left?findmin(p->left):p; } node* removemin(node* p) //        p { if( p->left==0 ) return p->right; p->left = removemin(p->left); return balance(p); } node* remove(node* p, int k) //   k   p { if( !p ) return 0; if( k < p->key ) p->left = remove(p->left,k); else if( k > p->key ) p->right = remove(p->right,k); else // k == p->key { node* q = p->left; node* r = p->right; delete p; if( !r ) return q; node* min = findmin(r); min->right = removemin(r); min->left = q; return balance(min); } return balance(p); } 



рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ


Source: https://habr.com/ru/post/In150732/


All Articles