私は、各タイプのトラバーサルで幅優先検索を使用してバイナリ検索ツリーを検索するプログラムを持っています。すべての関数が動作して実行されますが、最後のトラバーサル、ポストオーダートラバーサルは、ツリーにない数値を検索するときにtrueを返します。私はプログラムをデバッグして、それがポストオーダートラバーサル関数でツリー全体を走っているのを見ましたが、実際には一度も真を返すことはありませんが、依然として真の出力をプリントアウトしています。なぜ誰かが私に言うことができますか?boolean関数は、C++ではない場合にtrueを返します
#include <queue>
#include <iostream>
using namespace std;
struct Node
{
int data;
Node *left, *right;
}*root;
Node *createNode(int data)
{
Node *Tnode = new Node;
Tnode->left = NULL;
Tnode->right = NULL;
Tnode->data = data;
return Tnode;
}
vbool breadthFirstSearch(Node *node, int item)
{
queue<Node*> q;
if(root)
{
q.push(root);
while(!q.empty())
{
Node *d = q.front();
q.pop();
if(d->data == item)
return true;
if(d->left)
q.push(d->left);
if(d->right)
q.push(d->right);
}
}
return false;
}
bool inorderTraversal(Node *node, int item)
{
if(node == NULL)
return false;
inorderTraversal(node->left, item);
if(node->data == item)
return true;
inorderTraversal(node->right, item);
}
bool preorderTraversal(Node *node, int item)
{
if(node == NULL)
return false;
if(node->data == item)
return true;
preorderTraversal(node->left, item);
preorderTraversal(node->right, item);
}
bool postorderTraversal(Node *node, int item)
{
if(node == NULL)
return false;
postorderTraversal(node->left, item);
postorderTraversal(node->right, item);
if(node->data == item)
return true;
}
int main()
{
root = createNode(20);
root->left = createNode(10);
root->left->left = createNode(5);
root->left->right = createNode(15);
root->right = createNode(30);
root->right->left = createNode(25);
root->right->right = createNode(35);
cout<<"\n-----Breadth First Search Traversal-----\n";
if(breadthFirstSearch(root, 35) == true)
{
cout<< "The item 35 is in the tree\n";
}
else
{
cout << "The item 35 is not in the tree\n";
}
if(breadthFirstSearch(root, 29) == true)
{
cout<< "The item 29 is in the tree\n";
}
else
{
cout << "The item 29 is not in the tree\n";
}
cout<<"\n-----Inorder Search Traversal-----\n";
if(inorderTraversal(root, 35) == true)
{
cout<< "The item 35 is in the tree\n";
}
else
{
cout << "The item 35 is not in the tree\n";
}
if(inorderTraversal(root, 29) == true)
{
cout<< "The item 29 is in the tree\n";
}
else
{
cout << "The item 29 is not in the tree\n";
}
cout<<"\n-----Preorder Search Traversal-----\n";
if(preorderTraversal(root, 35) == true)
{
cout<< "The item 35 is in the tree\n";
}
else
{
cout << "The item 35 is not in the tree\n";
}
if(preorderTraversal(root, 29) == true)
{
cout<< "The item 29 is in the tree\n";
}
else
{
cout << "The item 29 is not in the tree\n";
}
cout<<"\n-----Postorder Search Traversal-----\n";
if(postorderTraversal(root, 35) == true)
{
cout<< "The item 35 is in the tree\n";
}
else
{
cout << "The item 35 is not in the tree\n";
}
if(postorderTraversal(root, 29) == true)
{
cout<< "The item 29 is in the tree\n";
}
else
{
cout << "The item 29 is not in the tree\n";
}
return 0;
}
他のトラバーサルはそれぞれ、35がツリーにあり、29がツリーにないことを正しく示しています。たとえ29がチェックされているときにtrueが返されなくても、ポストオーダーだけが29にツリーを表示します。私は何か小さくて愚かな行方不明だと確信していますが、私はそれを見つけることができないようです。
質問を簡略化してください。 – Caduchon
コンパイラは、関数の中にはリターンパスのすべての値を返さないことを警告しましたか?たとえば、 'inorderTraversal'は潜在的に値を返すことができないため、未定義の動作が呼び出されます。 – PaulMcKenzie
私はトラバーサルのほとんどに疑問を抱いていました - おそらく私はちょうど異なったコードを書いていましたが...(例えば)preorderはitem == dataならtrueを返してはいけません。プレオーダー(右)? – John