使用集和二叉搜索树解析和构建S表达式

|| 这是伪作业(这是额外的功劳)。我有一个BST,它是单词的索引,指向包含这些单词的行(存储在其他位置)。我需要实现一种使用s表达式进行搜索的方法,以便可以将(&)和或(|)组合在一起。 在命令提示符下,用户可以输入以下内容:
QUERY ((((fire)&(forest))|((ocean)&(boat)))&(water))
本质上,这应该返回包含火,森林和水的所有行以及包含海洋,船和水的所有行。 我真正需要帮助的是用于将节点解析和插入到树中的逻辑,以比实际代码更能恰当地表示表达式。我所做的唯一有意义的事情是为表达式中的每个单词返回一组行。然后根据它是\“ or \”还是\“ and \”操作,对这些集合执行并集或交集类型操作以创建新集合并将其传递到树上。 我对如何解析包含表达式的行有些迷惑。经过一番思考,似乎子表达式之一的“越远”在我的s表达式树中应该越高。我认为,只要我能正确地推动方向,就可以将表达式解析并插入树中就可以了。 我为上面的查询想出的样本树看起来像;
                                            &
                                         /     \\
                                       |       water
                                   /      \\
                                 &          &
                               /   \\        /   \\
                            fire  forest  ocean boat
这是有道理的,因为火将返回一组全部包含火的线,而森林将返回一组全部包含森林的线。然后,在\“&\”级别,我将采用这两个集合并创建另一个仅包含两个集合中的行的集合,从而为我提供一个仅包含火和林的行的集合。 我的另一个绊脚石是在克服解析障碍后,如何表示树中的所有内容。我有一个ExpTreeNode类,它将用作我的ExpTree(BST)的节点,然后有2个子类,运算符和操作数,但是我不确定这是否是一种好方法。     
已邀请:
Dijkstra已经为您做到了:-) 尝试使用调车场算法:http://en.wikipedia.org/wiki/Shunting-yard_algorithm 您可以使用调车码算法创建RPN(反向抛光符号),一旦创建,就可以通过它来创建二叉树。 通常,RPN用于进行评估,但是您实际上可以创建树。 例如,您无需创建评估,而是创建树节点并将其压入堆栈。 因此,如果您看到node1,node2和运算符。您创建一个新节点
   Operator
   /     \\
  node1   node2
并将其推回堆栈。 更详细的示例: 说表达式是
(apples AND oranges) OR kiwis
这个RPN是
kiwis oranges apples AND OR
现在在保持堆栈的同时行走。 使节点从奇异果中推入堆栈。橘子之外的节点推入堆栈。苹果也一样。 所以堆栈是
Node:Apples
Node:Oranges
Node:Kiwis
现在,您在RPN中看到AND。 您从堆栈中弹出前两个,并创建一个以AND为父节点的新Node。 节点:AND,[节点:苹果,节点:橙色] 基本上是树
       AND
     /    \\
  Apples  Oranges
现在将该节点压入堆栈。 所以堆栈是
Node:AND, [Node:Apples, Node:Oranges]
Node:Kiwis
现在您将在RPN中看到OR,并创建一个节点,其中OR为父节点,Node:ANd和Node Kiwis为子节点,得到树
           OR 
         /   \\
       AND   Kiwis
     /    \\
  Apples  Oranges
您甚至可以修改调车场算法来创建树,但是处理RPN似乎更容易。 或者,您可以尝试使用递归下降解析技术。您的要求非常普遍,即使您在网上搜索,也可以找到语法和代码。 顺便说一句,您只是说二叉树对吗? BST(二进制搜索树)有一个额外的限制...     

要回复问题请先登录注册