Я делаю блок под названием Структуры данных и алгоритмы. Мы только начали, и мой профессор только что научил нас основам алгебраической семантики, аксиом и т. Д. До сих пор я использовал деревья только в виде массивов. Не использовать подпись для предварительно упорядоченного дерева в качестве дерева (значение, дерево, дерево), где значение - это значение в узле, левый узел - это первое дерево, а правый узел - второе дерево.
Теперь, когда я определяю свое дерево как дерево (значение, дерево, дерево) или как ноль, я не могу понять, как определить алгебру для addNode (значение, дерево).
С каждым уровнем это становится все более и более сложным, плюс, я не могу думать о том, чтобы в любом случае сканировать один уровень как один раз, пытаясь с тех пор как час. Когда мы спускаемся по дереву, алгебра просто разветвляется на все больше и больше if-эльсов. Я делаю это правильно? Можете ли вы указать мне правильное направление? Или деревья не могут быть реализованы как дерево (значение, дерево, дерево)?
Это часть моего урока (не стоит никаких оценок по дополнительным вопросам), но я не ищу мгновенного ответа, мне нравится предмет, и я хотел бы узнать больше.
Редактировать 1: Я проверил Википедию, и я не хочу использовать учебник для четкого ответа, я просто ищу подсказку в правильном направлении, является ли мой подход правильным или совершенно невозможно определить дерево как дерево (значение, дерево, дерево). Я знаю, что вы можете представить дерево ADT в форме списка. Но я хотел действительно подумать об этом. Надеюсь, это имеет смысл. Большое спасибо, ребята!
Редактировать 2: Хм, это трудно объяснить через Интернет. Допустим, я определяю новую структуру данных под названием «дерево». Я могу определить его так, как я хочу, и он должен вести себя как сбалансированное двоичное дерево (хотя значения родителей и детей не имеют значения)
Поэтому я определяю его как дерево: дерево (значение, дерево, дерево) ИЛИ ноль
Это не программный код, это просто то, как я его определяю. Tree - это значение + 2 других дерева или Tree - ноль. Теперь addNode (значение, дерево) добавляет узел в дерево, сохраняя его сбалансированным.
Это не программный код, это просто алгебраическая семантика. Я не знаю, смогу ли я объяснить это правильно. Но я нашел решение, которого я могу достичь с помощью очередей или стеков, но это еще один ADT, который я должен определить, который недопустим.
Редактировать 3: Похоже, я предположил много вещей, которые сделали проблему сложнее, чем она должна была быть на самом деле. Прежде всего, из небольшого объяснения, которое я дал, Gamecat ответил идеально. Но я согласен с комментариями, вполне допустимо включать другие ADT. Фактически, когда мы строим что-либо, использующее Int, мы используем ADT для этой структуры. Я думал, что каждый ADT должен быть уникальным. В любом случае, большое спасибо, ребята, за ваши ответы!