-2

我创建了一个布尔函数来验证表达式树中的叶节点。如果节点是任何运算符,则返回 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);      
}

它实际上完美地打印出我所有叶节点的值,它们是:abcd 2 e 3。但是当我在我的主函数中运行它时,它总是返回错误。关于为什么的任何想法?

4

3 回答 3

2
 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);
}   
于 2013-04-25T19:14:56.900 回答
0

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

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

应该更像

_Bool res = validate(node->left);

然后对结果做一些事情。

于 2013-04-25T19:14:56.553 回答
0

它总是返回的原因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);
于 2013-04-25T19:23:13.800 回答