我做了一个布尔函数来验证表达式树中的叶节点。如果节点是任何运算符,则返回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。关于为什么的任何想法?
答案 0 :(得分: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);
}
答案 1 :(得分:0)
您不会将结果存储在任何地方。
validate(node->left);
validate(node->right);
应该更像
_Bool res = validate(node->left);
然后对结果做点什么。
答案 2 :(得分:0)
它总是返回false
的原因是这个表达式:
(node->key == '+' || '-' || '*' || '/')
实际上意味着
(node->key == '+') || ('-' != 0) ...
始终为true,因为-
字符的值不为零。
你也不需要把它变成if-else子句,我建议你这样做:
return !(node->key == '+' || node->key == '-'
|| node->key == '*' || node->key == '/');
至于最后一部分,我认为你需要这样做:
else
return validate(node->left) && validate(node->right);