Это псевдо домашнее задание (это дополнительный кредит). У меня BST, который является индекс слов, которые указывают на линии (хранящихся где-то еще), которые содержат слова. Мне нужно реализовать способ поиска с помощью S-выражений, так что я могу совмещать и (&) и или (|).
В командной строке пользователь может ввести что-то вроде:
QUERY ((((fire)&(forest))|((ocean)&(boat)))&(water))
По существу, который должен вернуть все строки, содержащие слова огня, лес и воду, а также все строки, содержащие океан, лодку и воду.
Что мне действительно нужна помощь с логика для разбора и вставки узлов в дерево, чтобы должным образом представить выражение больше, чем фактический код. Единственное, что я работал, что имеет смысл для меня возвращает набор строк для каждого слова в выражении. Тогда в зависимости от того если это «или» или «и» операции я бы выполнить объединение или операцию типа пересечения на этих наборах, чтобы создать новый набор и передать вверх по дереву.
Я бы потерял о том, как разобрать строку, содержащую выражение. После того, как некоторые думали, что кажется, что «дальше» из одного из суб-выражений, тем выше она должна быть в моем s-дерево выражения? Я думаю, что если бы я мог просто получить толчок в правильном направлении, насколько разборе и вставив выражения в дереве, я должен быть в порядке.
Мой образец дерево, которое я придумал для запроса выше выглядит примерно так;
&
/ \
| water
/ \
& &
/ \ / \
fire forest ocean boat
Это имеет смысл, как огнь будет возвращать набор строк, которые содержат огнь и лес будет возвращать набор строк, которые содержат все лес. Тогда на «и» уровень я бы эти два набора и создать еще один набор, содержащий только те строки, которые были в обоих наборах, таким образом, давая мне набор, который имеет только строки, которые содержат как огонь и лес.
Мое другой камень преткновения в том, как представлять все в дереве после того, как я преодолеть препятствие разбора. У меня есть класс ExpTreeNode, который будет служить в качестве узлов для моего ExpTree (БСТ), а затем у меня есть 2 подклассов, оператор и операнд, но я не уверен, если это хороший подход.













