-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 です。しかし、メイン関数で実行すると、常に false が返されます。理由についてのアイデアはありますか?

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

常に返さ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 に答える
0

結果をどこにも保存していません。

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

もっと似てるはず

_Bool res = validate(node->left);

そして、結果を使って何かをします。

于 2013-04-25T19:14:56.553 に答える