30 likes | 244 Views
总的来说,就是用二叉树来表示表达式,并构造所有的子表达式。关键函数如下: list<string > Parse(string exp) ; // 这个函数将输入的表达式转换为 tokenlist , token 可以是运算符,如 AND, OR ( ) 等,也可以是运算数,如 A1, B2… void Build(list<string> tokenList ) ; // 这个函数根据上面的 tokenlist 创建一棵表达式树,如下页所示
E N D
总的来说,就是用二叉树来表示表达式,并构造所有的子表达式。关键函数如下:总的来说,就是用二叉树来表示表达式,并构造所有的子表达式。关键函数如下: list<string> Parse(string exp) ; // 这个函数将输入的表达式转换为tokenlist,token 可以是运算符,如AND, OR ( )等,也可以是运算数,如A1, B2… void Build(list<string> tokenList) ; //这个函数根据上面的tokenlist创建一棵表达式树,如下页所示 void BuildExpString(Node* root) ; // 这个函数用来生成所有的子表达式,如最后一页所示。 void ExpTree::GetAllExpressions(list<string>& exps, const Node *root) const ; // 这个函数将所有表达式返回到exps中。你使用这个函数即可。
二叉树表达式 以 (A1 OR B2) AND C3 AND (D4 OR E5) 为例 运算符位于非叶子结点上,用椭圆表示 运算数位于叶子结点上,用方形表示 构造好这棵二叉树以后,将每个结点的data值连接到其父结点上,这样每个非叶子结点的data值都对应一个子表达式,遍历这棵二叉树,依次输出每个非叶子结点的data值即可,连接后的二叉树见下一页。 AND AND OR OR C3 D4 E5 A1 B2
(A1 OR B2) AND C3 AND (D4 OR E5) 依次将每个结点的data值粘贴到其父亲结点上 (A1 OR B2) AND C3 D4 OR E5 (A1 OR B2) C3 D4 E5 A1 B2 void ExpTree::PrintSubExpression(const Node* root) const { if (!IsLeaf(root)) { cout << root->data << endl ; PrintSubExpression(root->left) ; PrintSubExpression(root->right) ; } } 按先根序输出即可得到所有的子表达式