2013-04-25 52 views
-1

我幾乎有了我的驗證功能,但我只寫了最後一部分,它檢查內部節點以確保它們是操作者。如果沒有這個部分,函數會很好地檢查葉節點。但是,當我包含內部部分時,它會打印出第一個節點「 - 」並返回false。驗證表達式樹

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

問題代碼此功能..

if(node->left != NULL || node->right != NULL) 
    { 
     cout<<node->key<<endl<<endl; 
     if(node->key != '+' || node->key != '-' || node->key != '/' || node->key   != '*') 
      return false; 
    } 

沒有它,功能完美的作品!任何想法是什麼造成的?

+0

如果'node'等於NULL會發生什麼? – 2013-04-26 01:51:22

+1

您是否想要將您的ORs更改爲AND,例如||至 && ? – 2013-04-26 01:52:52

回答

0

語句if的表達式會破壞您的程序,因爲它會導致函數過早停止驗證節點。如果設置了leftright節點,它將檢查運營商,如果它找到一個,則返回true。如果發現匹配,則會阻止進一步的驗證發生,如果leftright或兩者均指向更多節點。如果用邏輯運算符替換邏輯運算符,則代碼仍可能失敗,因爲運算符的表達式檢查完全是重擊。爲了讓代碼塊的工作,將需要改變的東西是這樣的:

if(node->left == NULL && node->right == NULL) 
{ 
    cout<<node->key<<endl<<endl; 

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

    // nothing else to check since both left and right are null 
    return false; 
} 

您也過於複雜解決方案和重複的代碼。由於當前節點有效,因此只需檢查它爲運營商存儲的密鑰。在這種情況下,如果左和右節點不爲空,只需調用validate,並且只檢查當前節點密鑰。下面的代碼未經測試,但看起來正確。

bool validate(tnode* node) 
{ 
    cout << "validating leaf nodes...." << endl; 

    // Invalid node. 
    if(node == NULL) 
    { 
     cout << "Node is null";  
     return false; 
    } 

    // We have a left node, go validate it. 
    if(node->left != NULL) 
    { 
     return validate(node->left); 
    } 

    // We have a right node, go validate it. 
    if(node->right != NULL) 
    { 
     return validate(node->right); 
    } 

    // Now let's check the key. 
    cout << "Found leaf node " << node->key << endl << endl; 

    if(node->key == '+' || node->key == '-' 
     || node->key == '/' || node->key == '*') 
    { 
     // BOOYAH! 
     cout << "Operator: " << node->key << endl << endl; 
     return true; 
    } 


    // This isn't the key type we're looking for. 
    return false; 
} 

我還建議使validatetnode一個const合格成員函數,這是 C++畢竟。