Кіріспе

Ағаш деректері құрылымының шектеулі түрі Компьютерлік ғылымда, екілік ағаш – әрбір түйінінде ең көп дегенде екі баласы бар ағаш деректері құрылымы, олар сол бала және оң бала деп аталады. Яғни, бұл k-арлы ағаш. Жиын теориясын қолдана отырып, рекурсивті анықтама бойынша екілік ағаш – (L, S, R) түйіндес, мұнда L және R – екілік ағаштар немесе бос жиын, ал S – тамырды қамтитын бір элементті жиын. Графтар теориясы тұрғысынан алғанда, мұндағы екілік ағаштар – арборесценциялар. Сондықтан, екілік ағаш қазіргі заманғы компьютерлік ғылым терминологиясы қалыптасқанға дейін, екіге бөлінетін арборесценция деп те аталуы мүмкін. Екілік ағашты бағытталмаған граф ретінде қарастыруға болады, онда екілік ағаш реттелген, тамырланған ағаш болып табылады. Кейбір авторлар ағаштың тамырланғанын нақтылау үшін екілік ағаш орнына тамырланған екілік ағашты қолданады, бірақ жоғарыда көрсетілгендей, екілік ағаш әрқашан тамырланған. Математикада екілік ағаш термині автордан авторға өте мағыналық айырмашылықтарға ие болуы мүмкін. Кейбір авторлар компьютерлік ғылымда қолданылатын әдеттегі анықтаманы қолданады. Есептеу техникасында екілік ағаштар екі өте әртүрлі мақсатта қолданылуы мүмкін: Біріншіден, әрбір түйінге байланысты белгілі бір мән немесе атауға сүйенетін түйіндерге қол жеткізу құралы ретінде. Осылайша таңбаланған екілік ағаштар екілік іздеу ағаштары мен екілік үйінділерді жүзеге асыру үшін және тиімді іздеу мен сұрыптау үшін қолданылады. Кейбір жағдайларда, әсіресе екілік іздеу ағаштарында, түбір емес түйіндерді сол немесе оң бала ретінде белгілеу, тіпті бір ғана бала болған жағдайда да маңызды. Дегенмен, ағаштағы нақты түйіндердің орналасуы тұжырымдамалық ақпараттың бөлігі емес. Мысалы, стандартты екілік іздеу ағашында түйіндердің орналасуы олардың қосылған тәртібіне толығымен байланысты және мағынасын өзгертпей (мысалы, теңгерімдеу арқылы) қайта орналастырылуы мүмкін. Екіншіден, тиісті екіге бөлінетін құрылыммен деректерді ұсыну үшін. Мұндай жағдайларда, басқа түйіндердің үстіндегі және/немесе сол жақтағы немесе оң жақтағы түйіндердің нақты орналасуы ақпараттың бөлігі болып табылады (яғни, оны өзгерту мағынаны өзгертеді). Көрінетін мысалдар – Хаффман кодилеуі және кладограммалар. Құжаттарды тарауларға, бөлімдерге, абзацтарға және т.б. бөлу – n-арлы ағаштармен ұқсас мысал, бірақ екілік емес.

Рекурсивті анықтама

Бинарлық ағашты анықтау үшін, екі баланың тек біреуі ғана бос болу мүмкіндігі ескерілуі тиіс. Осы мақсатта, кейбір оқулықтарда кеңейтілген бинарлық ағаш деп аталатын бір құрылым қажет. Осылайша, кеңейтілген бинарлық ағаш рекурсивті түрде былай анықталады:

Граф теориясының тұжырымдамаларын қолдану

Бинарлы ағаш – тамырлы ағаш, сонымен қатар әр түйіннің ең көп дегенде екі баласы бар реттелген ағаш (ә. к. а. жазық ағаш). Тамырланған ағаш табиғи түрде деңгейлер туралы ұғым береді (тамырдан қашықтық); осылайша, әрбір түйін үшін балалар ұғымы төменгі деңгейдегі байланысқан түйіндер ретінде анықталуы мүмкін. Осы балаларды реттеу (мысалы, оларды жазықтықта көрсету арқылы) сол жақ бала мен оң жақ баланы ажыратуға мүмкіндік береді. Бірақ бұл сол жақ баласы бар, бірақ оң жақ баласы жоқ түйін мен оң жақ баласы бар, бірақ сол жақ баласы жоқ түйін арасындағы айырмашылықты көрсетпейді. Қажетті айырмашылықты алдымен қабырғаларды бөліп қарастыру арқылы жасауға болады; яғни, екілік ағашты (V, E1, E2) үштік ретінде анықтау, мұнда (V, E1 ∪ E2) тамырланған ағаш (теңдесі ароборесценция) және E1 ∩ E2 бос жиын, сондай-ақ барлық j ∈ {1, 2} үшін әрбір түйіннің ең көп дегенде бір Ej баласы болуы керек. Айырмалаудың бейресми жолы – «Математика энциклопедиясынан» цитата келтіре отырып, «әрбір түйіннің сол жақ баласы, оң жақ баласы, екеуі де бар немесе екеуі де жоқ» және бұл «барлығы әртүрлі» екілік ағаштар екенін нақтылау.

Бинарлы ағаштар түрлері

Ағаш терминологиясы толыққанды стандартталмаған, сондықтан әдебиеттерде әртүрліліктер кездеседі. Тамырланған екілік ағашта тамыр түйіні болады және әрбір түйіннің ең көп дегенде екі баласы болады. Толық екілік ағаш (кейде дұрыс, жазық немесе қатаң екілік ағаш деп те аталады) – әрбір түйінінде 0 немесе 2 баласы бар ағаш. Толық екілік ағашты анықтаудың тағы бір жолы – рекурсивті анықтама. Толық екілік ағаш мыналардың бірі болуы мүмкін:
Бір ғана төбе (бір түйін тамыр түйіні ретінде). Тамыр түйіні екі кіші ағашқа ие ағаш, олардың екеуі де толық екілік ағаштар. Кемілді екілік ағаш – барлық ішкі түйіндері екі балаға ие және барлық жапырақтарының тереңдігі немесе деңгейі бірдей (түбір түйінінен түйінге дейінгі қабырғалар немесе сілтемелер саны ретінде анықталатын түйін деңгейі). Кемілді екілік ағаш – толық екілік ағаш. Толық екілік ағаш – барлық деңгейлері, соңғысынан басқа, толығымен толтырылған екілік ағаш, ал соңғы деңгейдегі барлық түйіндер мүмкіндігінше сол жаққа орналасқан. Соңғы h деңгейінде 1 мен 2h аралығында түйіндер болуы мүмкін. Сондықтан, кемілді ағаш әрқашан толық болады, бірақ толық ағаш әрқашан кемілді бола бермейді. Кейбір авторлар «толық» терминін жоғарыда анықталғандай, кемілді екілік ағашқа сілтеме жасау үшін қолданады, сонда олар осы типтегі ағашты (соңғы деңгейі толыққанды толтырылмаған) жартылай толық екілік ағаш немесе дерлік толық екілік ағаш деп атайды. Толық екілік ағашты массивті пайдалану арқылы тиімді түрде бейнелеуге болады. Сондай-ақ, жапырақтарының ешқайсысы тамырдан басқа жапырақтардан тым алыс емес екілік ағастарды қарастыруға болады. (Әртүрлі теңгерімдеу схемалары «тымы алыс» анықтамасына әртүрліліктерге мүмкіндік береді.) Бұзылған (немесе патологиялық) ағашта әрбір ата-аналық түйіннің бір ғана балалық түйіні болады. Бұл ағаш байланысты тізім деректері сияқты жұмыс істейтінін білдіреді. Бұл жағдайда, екілік ағашты пайдаланудың артықшылығы айтарлықтай төмендейді, өйткені ол негізінен байланысты тізім болып табылады, оның уақыт күрделілігі O(n) (n – түйіндер саны), және ол түйінге екі сілтемеге байланысты байланысты тізімге қарағанда көбірек жад алады, ал теңгерімді екілік ағашта деректерді іздеу үшін күтілетін күрделілік O(log2n) болып табылады.

Бинарлы ағаштардың қасиеттері

Толық екілік ағаштағы түйіндердің саны ең аз және ең көп (яғни, кемелді екілік ағаштағы түйіндердің саны), мұндағы h – ағаштың биіктігі. Тек бір тамыр түйіні бар ағаштың биіктігі 0-ге тең. Түйіндердің ең аз саны биіктікті бір бірліге арттыру үшін тек екі бала түйінін қосу арқылы алынады, яғни тамыр түйінін санау үшін 1. Түйіндердің ең көп саны әрбір деңгейдегі түйіндерді толық толтыру арқылы алынады, яғни ол – кемелді ағаш. Кемелді ағаш үшін түйіндер саны , соңғы теңдік геометриялық прогрессия қосындысынан шығады. Бұл дегеніміз, ағаштың биіктігі h болса, түйіндердің саны болады. Кез келген бос емес екілік ағаш үшін, онда жапырақ түйіндерінің саны l, ал 2-дәрежелі түйіндерінің саны (екі баласы бар ішкі түйіндер) i болса, мына қатынас орындалады: . Бұл қатынастың дәлелі келесідей. Кемелді екілік ағаш үшін түйіндердің жалпы саны , ал жапырақ түйіндерінің саны l болады. Кемелді екілік ағаштан толық екілік ағаш жасау үшін, екі бауырлас түйіндер жұбы бірінен соң бірі алынып тасталады. Бұл "екі жапырақ түйіні алынып тасталады", "бір ішкі түйін алынып тасталады" және "алып тасталған ішкі түйін жапырақ түйініне айналады" дегенді білдіреді. Сондықтан, екі бауырлас түйінді алып тастау үшін бір жапырақ түйіні мен бір ішкі түйін алынып тасталады. Нәтижесінде, бұл қатынас толық екілік ағаш үшін де орындалады. Егер бауыры жоқ жапырақ түйіні бар екілік ағаш жасау керек болса, толық екілік ағаштан бір жапырақ түйіні алынып тасталады, сонда "бір жапырақ түйіні алынып тасталады" және "екі баласы алынып тасталған бір ішкі түйін" алынып тасталады. Бұл қатынас енді барлық бос емес екілік ағаштарды қамтиды. Егер берілген түйіндер саны n болса, ағашқа теңдестірілген толық ағаш немесе кемелді ағаш болатын ең төменгі мүмкін ағаш биіктігі h болады. Берілген биіктік h болса, түйіндердің саны кемелді ағаштағы түйіндер санынан аспауы керек. Демек, . Бинарлық ағаштың жапырақтарының саны l болса, онда ағаштың биіктігі кем дегенде h болады. Берілген биіктік h болса, сол биіктіктегі жапырақтардың саны кемелді ағаштағы жапырақтардың санынан аспауы керек. Демек, . Бос емес екілік ағашта, егер түйіндердің жалпы саны n, ал жиектердің жалпы саны e болса, онда . Бұл анық, өйткені әрбір түйінге тамыр түйінінен басқа бір жиек қажет. n түйіні бар екілік ағаштағы нөлдік сілтемелердің саны (яғни, балалары жоқ түйіндер) (n + 1) болады. n түйіні бар толық екілік ағаштағы ішкі түйіндердің саны: .

Комбинаторлық

Комбинаторикада берілген өлшемдегі толық екілік ағаштардың санын санау мәселесі қарастырылады. Мұнда ағаштардың түйіндеріне қосылған мәндер жоқ (бұл мүмкін ағаштардың санын оңай анықталатын фактормен көбейтеді), ал ағаштар тек олардың құрылымымен ғана ерекшеленеді; дегенмен, кез-келген түйіннің сол және оң баласы ерекшеленеді (егер олар әртүрлі ағаштар болса, онда оларды алмастыру түпнұсқадан ерекшеленген ағаш шығарады). Ағаштың өлшемі ішкі түйіндердің n саны (екі баласы барлар) деп есептеледі; басқа түйіндер жапырақ түйіндері болып табылады және олардың саны n + 1. Мұндай n өлшемді екілік ағаштардың саны әр оператордың аргумент субтерминдерін анықтау үшін n екілік операторлармен (ішкі түйіндерді білдіретін) бөлінген n + 1 символдар тізбесін (жапырақтарды білдіретін) толық жақшалаудың жолдарының санына тең. Мысалы, X*X*X*X сияқты тізбекті жақшаға қою керек, бұл бес жолмен мүмкін: Екілік ағаштарға сәйкестік айқын болуы керек, ал артық жақшаларды қосуға (бұрыннан жақшаға салынған өрнектің айналасында немесе толық өрнектің айналасында) рұқсат етілмейді (немесе кем дегенде жаңа мүмкіндікті пайда ету ретінде есептелмейді). 0 өлшемді (бір жапырақтан тұратын) бірегей екілік ағаш бар, ал кез келген басқа екілік ағаш сол және оң балаларының жұбымен сипатталады; егер олардың өлшемдері i және j болса, толық ағаштың мөлшері i + j + 1 болады. Сондықтан n өлшемді екілік ағаштар саны келесі рекурсивті сипаттамаға ие және кез келген оң бүтін сан үшін n. Бұл n индексінің Каталон саны болып табылады. Жоғарыда келтірілген жақшалы тізбектерді тек жақшалардан тұратын, дұрыс теңдестірілген 2n ұзындығындағы сөздердің жиынтығымен шатастыруға болмайды. Мұндай тізбектердің саны бірдей рекурсивті сипаттамаға сәйкес келеді (ұзындығы 2n-ге тең әр Dyck сөзі бастапқы '(' және оның сәйкес келетін ') ' дегенмен бірге, 2i және 2j ұзындығы қанағаттандыратын 2i және 2j ұзындығы қанағаттандыратын 2j тізбегімен бірге)); сондықтан бұл сан да Каталон саны болып табылады. Сонымен қатар ұзындығы 6-ға тең бес Dyck сөзі бар: Бұл Dyck сөзі екілік ағаштарға бірдей сәйкес келмейді. Оның орнына, олар келесі рекурсивті анықталған биекциямен байланысты: бос тізбекке тең Dyck сөзі 0-ден бір жапырақты екілік ағашты құрайды. Кез келген басқа Dyck сөзін , , деп жазуға болады, мұнда , - бұл Dyck сөздері және екі жазу жақшасы сәйкес келеді. Биекция сөздерді қалдырып, тамырдың сол және оң балалары болып табылатын екілік ағаштарға сәйкес келеді. Биективті сәйкестікті келесідей де анықтауға болады: Dyck сөзін қосымша жұп жақшаға кіргізіңіз, сонда нәтиже Lisp тізімінің өрнегі ретінде түсіндірілуі мүмкін (бос тізім тек пайда болған атом ретінде); содан кейін осы тізімдегі нүктелі жұп өрнегі сәйкес келетін екілік ағашты сипаттайтын толық жақшалы өрнек (символ ретінде NIL және '.' оператор ретінде) болады (бұл, шын мәнінде, тиісті тізімнің ішкі бейнеленуі). Бинарлы ағаштарды символдар мен жақшалар тізбегі ретінде бейнелеу мүмкіндігі бинарлы ағаштар еркін магма элементтерін бірлік жиынтығында бейнелей алады дегенді білдіреді.

Бинарлы ағаштарды сақтау әдістері

Бинарлы ағаштарды бағдарламалау тілінің негізгі элементтерінен әр түрлі тәсілдермен құруға болады.

Массивтер

Бинарлық ағаштар кеңдік бойынша бірінші ретпен массивтердегі жасырын дерек құрылымы ретінде сақталуы мүмкін, және егер ағаш толық бинарлық ағаш болса, бұл әдіс орынды ысыраптамайды. Осы ықшам орналасуда, егер түйіннің индексі i болса, оның балалары (сол бала үшін) және (оң бала үшін) индекстерінде табылады, ал оның атасы (бар болса) индексте табылады (тамырдың индексі нөл деп есептегенде). 1-ден басталатын индекстелген массивті пайдаланғанда, балаларды табу оңайлатылады және , ал атасын табу . Бұл әдіс ықшам сақтаудан және жақсы жадқа сілтеме жасаудан пайда алады, әсіресе тізбек бойынша келу кезінде. Дегенмен, оны кеңейту қымбатқа түседі және n түйіні бар h тереңдіктегі ағаш үшін 2h n пропорциясында орын ысыраптайды. Бұл сақтау әдісі көбінесе бинарлық үйірмелер үшін қолданылады.