В информатике троичное дерево — это древовидная структура данных , в которой каждый узел имеет не более трех дочерних узлов , обычно различаемых как «левый», «средний» и «правый». Узлы с дочерними узлами являются родительскими узлами, а дочерние узлы могут содержать ссылки на своих родителей. За пределами дерева часто имеется ссылка на «корневой» узел (предок всех узлов), если он существует. Любой узел в структуре данных может быть достигнут, начиная с корневого узла и многократно следуя ссылкам либо на левого, среднего, либо на правого дочернего узла.
Тернарные деревья используются для реализации тернарных деревьев поиска и тернарных куч .
– Пусть – высота тернарного дерева.
– Пусть – максимальное число узлов в троичном дереве высоты h
–
– Каждое дерево высоты h имеет не более узлов.
Узлы могут быть вставлены в тернарные деревья между тремя другими узлами или добавлены после внешнего узла . В тернарных деревьях вставляемый узел указывается относительно того, каким дочерним узлом он является.
Предположим, что внешний узел, к которому добавляется узел, — это узел A. Чтобы добавить новый узел после узла A, A назначает новый узел в качестве одного из своих дочерних узлов, а новый узел назначает узел A в качестве своего родительского узла.
Вставка на внутренних узлах сложнее, чем на внешних узлах. Допустим, что внутренний узел — это узел A, а узел B — дочерний узел A. (Если вставка заключается в вставке правого дочернего узла, то B — правый дочерний узел A, и аналогично с вставкой левого дочернего узла или среднего дочернего узла.) A назначает своего дочернего узла новому узлу, а новый узел назначает своего родителя A. Затем новый узел назначает своего дочернего узла B, а B назначает своего родителя в качестве нового узла.
Удаление — это процесс, посредством которого узел удаляется из дерева. Только определенные узлы в тернарном дереве могут быть удалены однозначно.
Допустим, что удаляемый узел — это узел A. Если у узла нет потомков ( внешний узел ), удаление выполняется путем установки потомка родителя A в значение null и родителя A в значение null. Если у него есть один потомок, установите родителя потомка A в значение родителя A и установите потомка родителя A в значение потомка A.
На рисунке ниже показано бинарное дерево поиска , представляющее 12 двухбуквенных слов. Все узлы на левом потомке имеют меньшие значения, в то время как все узлы на правом потомке имеют большие значения для всех узлов. Поиск начинается с корня. Чтобы найти слово "ON", мы сравниваем его с "IN" и берем правую ветвь. Каждое сравнение может получить доступ к каждому символу обоих слов.
в / \ быть из / \ / \ как есть или \ \ \ / \ в он это на
Цифровой поиск пытается хранить строки посимвольно. Следующая картинка — это дерево, представляющее тот же набор из 12 слов;
_ _ _ _ _ _ _ _ _ _ _ _ _ / / / \ \ \ / / / \ \ \ абхиот / \ / \ | / | \ /|\ | steyenstfnro как в быть он в это из на или к
каждое входное слово показано под узлом, который его представляет. В дереве, представляющем слова из строчных букв, каждый узел имеет 26-путевое ветвление. Поиск очень быстрый: поиск "IS" начинается с корня, берет ветвь "I", затем ветвь "S" и заканчивается в нужном узле. В каждом узле осуществляется доступ к элементу массива, проверка на null и берет ветвь.
я / | \ / | \ бсо / | \ / \ | \ aehntnt | \ | / \ | сиефро \ т
На рисунке выше показано сбалансированное троичное дерево поиска для того же набора из 12 слов. Низкие и высокие указатели показаны в виде наклонных линий, а равные указатели показаны в виде вертикальных линий. Поиск слова «IS» начинается с корня, продолжается вниз по равному дочернему элементу до узла со значением «S» и останавливается там после двух сравнений. Поиск «AX» делает три сравнения с первой буквой «A» и два сравнения со второй буквой «X», прежде чем сообщить, что слова нет в дереве. [1]