我有一个关于使用 Boost Spirit 库生成的抽象语法树的问题。
我找到了很多关于在二叉搜索树中删除节点和子树的信息,但我找不到关于 AST 的相同信息。我在 AS 树中有一个节点,该节点是完整树的子树的根。现在我想删除节点及其所有子节点。
我不知道该怎么做,Boost Spirit 文档也没有帮助。
有没有人给我任何提示?
树是使用 (Boost 1.46.1) 生成的:
tree_parse_info<> info = ast_parse(expression.c_str(), parser, skipparser);
表达式是这样的:
(variable_17 OR variable_18) AND function( variable_17) <= 30 OR function( subkey_18) <= 30
我用
tree_match<iterator_t>::tree_iterator tree_it = info.trees.begin();
获取树的开头,然后我检查其中一个子树是否是冗余的(与删除本身没有任何关系)。`然后我使用遍历树
tree_match<iterator_t>::tree_iterator children_it = tree_it->children.begin()
并使用其子级调用相同的函数(递归)。我无法发布完整的代码,但这是其中最重要的部分。我想,我可以遍历冗余子树的叶子节点,并将它们设置为 null,或者类似的东西。然后我又上树,把其他所有的孩子一个接一个地删除。然而,到目前为止,没有任何效果。
遍历树的一个例子:The Traversing 这就是答案。
如果我不能删除任何节点,有没有人有想法,如何在现有树的基础上创建一棵新树,跳过它的冗余部分。