Кіріспе
Ағаш деректері құрылымының шектеулі түрі Компьютерлік ғылымда, екілік ағаш – әрбір түйінінде ең көп дегенде екі баласы бар ағаш деректері құрылымы, олар сол бала және оң бала деп аталады. Яғни, бұл k-арлы ағаш. Жиын теориясын қолдана отырып, рекурсивті анықтама бойынша екілік ағаш – (L, S, R) түйіндес, мұнда L және R – екілік ағаштар немесе бос жиын, ал S – тамырды қамтитын бір элементті жиын. Графтар теориясы тұрғысынан алғанда, мұндағы екілік ағаштар – арборесценциялар. Сондықтан, екілік ағаш қазіргі заманғы компьютерлік ғылым терминологиясы қалыптасқанға дейін, екіге бөлінетін арборесценция деп те аталуы мүмкін. Екілік ағашты бағытталмаған граф ретінде қарастыруға болады, онда екілік ағаш реттелген, тамырланған ағаш болып табылады. Кейбір авторлар ағаштың тамырланғанын нақтылау үшін екілік ағаш орнына тамырланған екілік ағашты қолданады, бірақ жоғарыда көрсетілгендей, екілік ағаш әрқашан тамырланған. Математикада екілік ағаш термині автордан авторға өте мағыналық айырмашылықтарға ие болуы мүмкін. Кейбір авторлар компьютерлік ғылымда қолданылатын әдеттегі анықтаманы қолданады. Есептеу техникасында екілік ағаштар екі өте әртүрлі мақсатта қолданылуы мүмкін: Біріншіден, әрбір түйінге байланысты белгілі бір мән немесе атауға сүйенетін түйіндерге қол жеткізу құралы ретінде. Осылайша таңбаланған екілік ағаштар екілік іздеу ағаштары мен екілік үйінділерді жүзеге асыру үшін және тиімді іздеу мен сұрыптау үшін қолданылады. Кейбір жағдайларда, әсіресе екілік іздеу ағаштарында, түбір емес түйіндерді сол немесе оң бала ретінде белгілеу, тіпті бір ғана бала болған жағдайда да маңызды. Дегенмен, ағаштағы нақты түйіндердің орналасуы тұжырымдамалық ақпараттың бөлігі емес. Мысалы, стандартты екілік іздеу ағашында түйіндердің орналасуы олардың қосылған тәртібіне толығымен байланысты және мағынасын өзгертпей (мысалы, теңгерімдеу арқылы) қайта орналастырылуы мүмкін. Екіншіден, тиісті екіге бөлінетін құрылыммен деректерді ұсыну үшін. Мұндай жағдайларда, басқа түйіндердің үстіндегі және/немесе сол жақтағы немесе оң жақтағы түйіндердің нақты орналасуы ақпараттың бөлігі болып табылады (яғни, оны өзгерту мағынаны өзгертеді). Көрінетін мысалдар – Хаффман кодилеуі және кладограммалар. Құжаттарды тарауларға, бөлімдерге, абзацтарға және т.б. бөлу – n-арлы ағаштармен ұқсас мысал, бірақ екілік емес.
In computer science, a binary tree is a tree data structure in which each node has at most two children, referred to as the left child and the right child. That is, it is a k ary tree with A recursive definition using set theory is that a binary tree is a tuple (L, S, R), where L and R are binary trees or the empty set and S is a singleton set containing the root. From a graph theory perspective, binary trees as defined here are arborescences. A binary tree may thus be also called a bifurcating arborescence, before the modern computer science terminology prevailed. It is also possible to interpret a binary tree as an undirected, rather than directed graph, in which case a binary tree is an ordered, rooted tree. Some authors use rooted binary tree instead of binary tree to emphasize the fact that the tree is rooted, but as defined above, a binary tree is always rooted. In mathematics, what is termed binary tree can vary significantly from author to author. Some use the definition commonly used in computer science,
In computing, binary trees can be used in two very different ways:
First, as a means of accessing nodes based on some value or label associated with each node. Binary trees labelled this way are used to implement binary search trees and binary heaps, and are used for efficient searching and sorting. The designation of non root nodes as left or right child even when there is only one child present matters in some of these applications, in particular, it is significant in binary search trees. However, the arrangement of particular nodes into the tree is not part of the conceptual information. For example, in a normal binary search tree the placement of nodes depends almost entirely on the order in which they were added, and can be re arranged (for example by balancing) without changing the meaning. Second, as a representation of data with a relevant bifurcating structure. In such cases, the particular arrangement of nodes under and/or to the left or right of other nodes is part of the information (that is, changing it would change the meaning). Common examples occur with Huffman coding and cladograms. The everyday division of documents into chapters, sections, paragraphs, and so on is an analogous example with n ary rather than binary trees.
Рекурсивті анықтама
Бинарлық ағашты анықтау үшін, екі баланың тек біреуі ғана бос болу мүмкіндігі ескерілуі тиіс. Осы мақсатта, кейбір оқулықтарда кеңейтілген бинарлық ағаш деп аталатын бір құрылым қажет. Осылайша, кеңейтілген бинарлық ағаш рекурсивті түрде былай анықталады:
Граф теориясының тұжырымдамаларын қолдану
Бинарлы ағаш – тамырлы ағаш, сонымен қатар әр түйіннің ең көп дегенде екі баласы бар реттелген ағаш (ә. к. а. жазық ағаш). Тамырланған ағаш табиғи түрде деңгейлер туралы ұғым береді (тамырдан қашықтық); осылайша, әрбір түйін үшін балалар ұғымы төменгі деңгейдегі байланысқан түйіндер ретінде анықталуы мүмкін. Осы балаларды реттеу (мысалы, оларды жазықтықта көрсету арқылы) сол жақ бала мен оң жақ баланы ажыратуға мүмкіндік береді. Бірақ бұл сол жақ баласы бар, бірақ оң жақ баласы жоқ түйін мен оң жақ баласы бар, бірақ сол жақ баласы жоқ түйін арасындағы айырмашылықты көрсетпейді. Қажетті айырмашылықты алдымен қабырғаларды бөліп қарастыру арқылы жасауға болады; яғни, екілік ағашты (V, E1, E2) үштік ретінде анықтау, мұнда (V, E1 ∪ E2) тамырланған ағаш (теңдесі ароборесценция) және E1 ∩ E2 бос жиын, сондай-ақ барлық j ∈ {1, 2} үшін әрбір түйіннің ең көп дегенде бір Ej баласы болуы керек. Айырмалаудың бейресми жолы – «Математика энциклопедиясынан» цитата келтіре отырып, «әрбір түйіннің сол жақ баласы, оң жақ баласы, екеуі де бар немесе екеуі де жоқ» және бұл «барлығы әртүрлі» екілік ағаштар екенін нақтылау.
Бинарлы ағаштар түрлері
Ағаш терминологиясы толыққанды стандартталмаған, сондықтан әдебиеттерде әртүрліліктер кездеседі. Тамырланған екілік ағашта тамыр түйіні болады және әрбір түйіннің ең көп дегенде екі баласы болады. Толық екілік ағаш (кейде дұрыс, жазық немесе қатаң екілік ағаш деп те аталады) – әрбір түйінінде 0 немесе 2 баласы бар ағаш. Толық екілік ағашты анықтаудың тағы бір жолы – рекурсивті анықтама. Толық екілік ағаш мыналардың бірі болуы мүмкін:
Бір ғана төбе (бір түйін тамыр түйіні ретінде). Тамыр түйіні екі кіші ағашқа ие ағаш, олардың екеуі де толық екілік ағаштар. Кемілді екілік ағаш – барлық ішкі түйіндері екі балаға ие және барлық жапырақтарының тереңдігі немесе деңгейі бірдей (түбір түйінінен түйінге дейінгі қабырғалар немесе сілтемелер саны ретінде анықталатын түйін деңгейі). Кемілді екілік ағаш – толық екілік ағаш. Толық екілік ағаш – барлық деңгейлері, соңғысынан басқа, толығымен толтырылған екілік ағаш, ал соңғы деңгейдегі барлық түйіндер мүмкіндігінше сол жаққа орналасқан. Соңғы h деңгейінде 1 мен 2h аралығында түйіндер болуы мүмкін. Сондықтан, кемілді ағаш әрқашан толық болады, бірақ толық ағаш әрқашан кемілді бола бермейді. Кейбір авторлар «толық» терминін жоғарыда анықталғандай, кемілді екілік ағашқа сілтеме жасау үшін қолданады, сонда олар осы типтегі ағашты (соңғы деңгейі толыққанды толтырылмаған) жартылай толық екілік ағаш немесе дерлік толық екілік ағаш деп атайды. Толық екілік ағашты массивті пайдалану арқылы тиімді түрде бейнелеуге болады. Сондай-ақ, жапырақтарының ешқайсысы тамырдан басқа жапырақтардан тым алыс емес екілік ағастарды қарастыруға болады. (Әртүрлі теңгерімдеу схемалары «тымы алыс» анықтамасына әртүрліліктерге мүмкіндік береді.) Бұзылған (немесе патологиялық) ағашта әрбір ата-аналық түйіннің бір ғана балалық түйіні болады. Бұл ағаш байланысты тізім деректері сияқты жұмыс істейтінін білдіреді. Бұл жағдайда, екілік ағашты пайдаланудың артықшылығы айтарлықтай төмендейді, өйткені ол негізінен байланысты тізім болып табылады, оның уақыт күрделілігі O(n) (n – түйіндер саны), және ол түйінге екі сілтемеге байланысты байланысты тізімге қарағанда көбірек жад алады, ал теңгерімді екілік ағашта деректерді іздеу үшін күтілетін күрделілік O(log2n) болып табылады.
A single vertex (a single node as the root node). A tree whose root node has two subtrees, both of which are full binary trees. A perfect binary tree is a binary tree in which all interior nodes have two children and all leaves have the same depth or same level (the level of a node defined as the number of edges or links from the root node to a node). A perfect binary tree is a full binary tree. A complete binary tree is a binary tree in which every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes at the last level h. A perfect tree is therefore always complete but a complete tree is not always perfect. Some authors use the term complete to refer instead to a perfect binary tree as defined above, in which case they call this type of tree (with a possibly not filled last level) an almost complete binary tree or nearly complete binary tree. A complete binary tree can be efficiently represented using an array. One may also consider binary trees where no leaf is much farther away from the root than any other leaf. (Different balancing schemes allow different definitions of "much farther".) A degenerate (or pathological) tree is where each parent node has only one associated child node. This means that the tree will behave like a linked list data structure. In this case, an advantage of using a binary tree is significantly reduced because it is essentially a linked list which time complexity is O(n) (n as the number of nodes) and it has more data space than the linked list due to two pointers per node, while the complexity of O(log2n) for data search in a balanced binary tree is normally expected.
Бинарлы ағаштардың қасиеттері
Толық екілік ағаштағы түйіндердің саны ең аз және ең көп (яғни, кемелді екілік ағаштағы түйіндердің саны), мұндағы 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 және '.' оператор ретінде) болады (бұл, шын мәнінде, тиісті тізімнің ішкі бейнеленуі). Бинарлы ағаштарды символдар мен жақшалар тізбегі ретінде бейнелеу мүмкіндігі бинарлы ағаштар еркін магма элементтерін бірлік жиынтығында бейнелей алады дегенді білдіреді.
The correspondence to binary trees should be obvious, and the addition of redundant parentheses (around an already parenthesized expression or around the full expression) is disallowed (or at least not counted as producing a new possibility). There is a unique binary tree of size 0 (consisting of a single leaf), and any other binary tree is characterized by the pair of its left and right children; if these have sizes i and j respectively, the full tree has size i + j + 1. Therefore, the number of binary trees of size n has the following recursive description , and for any positive integer n. It follows that is the Catalan number of index n.
The above parenthesized strings should not be confused with the set of words of length 2n in the Dyck language, which consist only of parentheses in such a way that they are properly balanced. The number of such strings satisfies the same recursive description (each Dyck word of length 2n is determined by the Dyck subword enclosed by the initial '(' and its matching ')' together with the Dyck subword remaining after that closing parenthesis, whose lengths 2i and 2j satisfy ); this number is therefore also the Catalan number So there are also five Dyck words of length 6:
These Dyck words do not correspond to binary trees in the same way. Instead, they are related by the following recursively defined bijection: the Dyck word equal to the empty string corresponds to the binary tree of size 0 with only one leaf. Any other Dyck word can be written as , where , are themselves (possibly empty) Dyck words and where the two written parentheses are matched. The bijection is then defined by letting the words and correspond to the binary trees that are the left and right children of the root. A bijective correspondence can also be defined as follows: enclose the Dyck word in an extra pair of parentheses, so that the result can be interpreted as a Lisp list expression (with the empty list as only occurring atom); then the dotted pair expression for that proper list is a fully parenthesized expression (with NIL as symbol and '.' as operator) describing the corresponding binary tree (which is, in fact, the internal representation of the proper list). The ability to represent binary trees as strings of symbols and parentheses implies that binary trees can represent the elements of a free magma on a singleton set.
Бинарлы ағаштарды сақтау әдістері
Бинарлы ағаштарды бағдарламалау тілінің негізгі элементтерінен әр түрлі тәсілдермен құруға болады.
Массивтер
Бинарлық ағаштар кеңдік бойынша бірінші ретпен массивтердегі жасырын дерек құрылымы ретінде сақталуы мүмкін, және егер ағаш толық бинарлық ағаш болса, бұл әдіс орынды ысыраптамайды. Осы ықшам орналасуда, егер түйіннің индексі i болса, оның балалары (сол бала үшін) және (оң бала үшін) индекстерінде табылады, ал оның атасы (бар болса) индексте табылады (тамырдың индексі нөл деп есептегенде). 1-ден басталатын индекстелген массивті пайдаланғанда, балаларды табу оңайлатылады және , ал атасын табу . Бұл әдіс ықшам сақтаудан және жақсы жадқа сілтеме жасаудан пайда алады, әсіресе тізбек бойынша келу кезінде. Дегенмен, оны кеңейту қымбатқа түседі және n түйіні бар h тереңдіктегі ағаш үшін 2h n пропорциясында орын ысыраптайды. Бұл сақтау әдісі көбінесе бинарлық үйірмелер үшін қолданылады.