试图验证表达式树中的叶节点

trying to validate leaf nodes in expression tree

本文关键字:叶节点 表达式 验证      更新时间:2023-10-16

我创建了一个布尔函数,用于验证表达式树中的叶节点。如果节点是任意运算符,则返回false。否则,它应该返回true。它递归地调用自己…我认为这就是问题所在。你能让布尔函数递归吗?这是我的函数

bool validate(tnode* node)
{
  if(node == NULL)
  {
    cout<<"Node is null";       
    return false;
  }
  if(node->left == NULL && node->right==NULL) 
  {
    cout<<node->key<<endl<<endl;
    if(node->key == '+' || '-' || '*' || '/')
        return false;
    else 
        return true;
  }     
  else
        validate(node->left);
        validate(node->right);      
}

它实际上完美地打印出所有叶节点的值,它们是:a b c d 2 e 3。但是当我在main函数中运行它时,它总是返回false。知道为什么吗?

 if(node->key == '+' || '-' || '*' || '/')
应该

if(node->key == '+' || node->key == '-' || node->key == '*' || node->key == '/')
与此同时:

else {
    validate(node->left);
    validate(node->right);   
} //should not miss the parenthesis

你可能应该这样做:

else{
      bool left = validate(node->left);
      bool right = validate(node->right);
      return (left && right);
}   

您没有将结果存储在任何地方。

validate(node->left);
validate(node->right);   

应该更像

_Bool res = validate(node->left);

然后处理结果

它总是返回false的原因是:

(node->key == '+' || '-' || '*' || '/')

实际上意味着

(node->key == '+') || ('-' != 0) ...

总是为真,因为-字符没有零值。

你也不需要把它变成if-else子句,我建议这样做:

return !(node->key == '+' || node->key == '-'
      || node->key == '*' || node->key == '/');

关于最后一部分,我认为你需要这样做:

else
    return validate(node->left) && validate(node->right);