遍历二叉树并保留列表

时间:2016-11-06 17:20:40

标签: c++ binary-search-tree

我已经实现了命题逻辑语句的CNF形式的二进制解析树。为了检查命题逻辑的有效性,首先我拆分结合,然后检查是否存在原子或其否定。如果它们存在,而另一个不存在,则该函数返回false。否则返回true

但是,我对此有点麻烦...

bool Tree::Valid(Node *n = NULL)
{
    if (n == NULL) n = root;
    if (n->data == AND)
        return Valid(n->Lchild) && Valid(n->Rchild);
    bool normal[26], negated[26];
    for (int i = 0; i < 26; ++i)
        normal[i] = negated[i] = false;
    void checkChild(Node *nChild)
    {
        if (isalpha(nChild->data))
            normal[nChild->data -'a'] = true;
        else if (nChild->data == NOT)
            negated[nChild->Rchild->data - 'a'] = true;
        else
        {
            checkChild(nChild->Lchild);
            checkChild(nChild->Rchild);
        }
    }
    checkChild(n);
    for (int i = 0; i < 26; ++i)
    {
        if (normal[i] != negated[i])
            return false;
    }
    return true;
}

我意识到你不能像这样嵌套这个功能,但我不知道如何绕过它。

感谢您的帮助!

(编辑) 这是我实施的解析树的一个例​​子。字母是原子,&#39;〜&#39;代表否定......这基本上是说否定正确的孩子(在CNF中总是一个原子)。原子可以是任何字母a-z。有两个二元运算符&#39; +&#39;,&#39; *&#39;和一个一元运算符&#39;〜&#39;。原子可以被认为是布尔变量。

CNF表格定义为:
答:=原子|否定原子
B:= A + B |一个
C:= C * B |乙
enter image description here

0 个答案:

没有答案