Ich habe einen Code für einen binären Suchbaum für Strings bearbeitet. Aber da ist ein kleines Problem. Wenn ich eine einfache Eingabe wie A B C D E F gebe, sagt mein Programm, dass das Vorbestellformular A B C D E F
... ist, was eigentlich A B D E C F
sein sollte.Warum wird mein Code im Binary Search Tree das Vorbestellformular nicht korrekt ausfüllen?
Da, sollte es das Wort an der Wurzel drucken dann das Wort an der linken Unterbaum in vorbestellbarer drucken und dann das Wort an rechten Teilbaum in vorbestellbarer drucken.
Beitrag Auftrag sollte auch D E B F C A
drucken, aber er druckt A B C D E F
und in Ordnung D B E A F C
haben sollte gedruckt ... aber es gab mir nur F E D C B A
.
Jede Hilfe wird geschätzt, ich weiß nicht, was schief gelaufen ist.
Hier ist die Arbeits vollständigen Quellcode:
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
class Node {
string word;
Node* left;
Node* right;
public:
Node() { word=-1; left=NULL; right=NULL; };
void setWord(string aWord) { word = aWord; };
void setLeft(Node* aLeft) { left = aLeft; };
void setRight(Node* aRight) { right = aRight; };
string Word() { return word; };
Node* Left() { return left; };
Node* Right() { return right; };
};
class Tree {
Node* root;
public:
Tree();
~Tree();
Node* Root() { return root; };
void addNode(string word);
void inOrder(Node* n);
void preOrder(Node* n);
void postOrder(Node* n);
private:
void addNode(string word, Node* leaf);
void freeNode(Node* leaf);
};
Tree::Tree() {
root = NULL;
}
Tree::~Tree() {
freeNode(root);
}
void Tree::freeNode(Node* leaf)
{
if (leaf != NULL)
{
freeNode(leaf->Left());
freeNode(leaf->Right());
delete leaf;
}
}
void Tree::addNode(string word) {
if (root == NULL) {
Node* n = new Node();
n->setWord(word);
root = n;
}
else {
addNode(word, root);
}
}
void Tree::addNode(string word, Node* leaf) {
if (word <= leaf->Word()) {
if (leaf->Left() != NULL)
addNode(word, leaf->Left());
else {
Node* n = new Node();
n->setWord(word);
leaf->setLeft(n);
}
}
else {
if (leaf->Right() != NULL)
addNode(word, leaf->Right());
else {
Node* n = new Node();
n->setWord(word);
leaf->setRight(n);
}
}
}
void Tree::inOrder(Node* n) {
if (n) {
inOrder(n->Left());
cout << n->Word() << " ";
inOrder(n->Right());
}
}
void Tree::preOrder(Node* n) {
if (n) {
cout << n->Word() << " ";
preOrder(n->Left());
preOrder(n->Right());
}
}
void Tree::postOrder(Node* n) {
if (n) {
postOrder(n->Left());
postOrder(n->Right());
cout << n->Word() << " ";
}
}
int main() {
string word;
Tree* tree = new Tree();
while(word != "end"){
cin >> word;
if(word == "end"){
break;
}
tree->addNode(word);
}
cout << "In order traversal" << endl;
tree->inOrder(tree->Root());
cout << endl;
cout << "Pre order traversal" << endl;
tree->preOrder(tree->Root());
cout << endl;
cout << "Post order traversal" << endl;
tree->postOrder(tree->Root());
cout << endl;
delete tree;
_getch();
return 0;
}
Debugger. Verwenden Sie einen Debugger. Ein Debugger ermöglicht es Ihnen, jede Anweisung nacheinander auszuführen und Werte von Variablen * zu beobachten. Bearbeiten Sie Ihren Beitrag mit Details zur verdächtigen Anweisung, nachdem Sie den Debugger verwendet haben. –
Hi @ThomasMatthews Ich bin ziemlich unsicher, wie man einen Debugger benutzt. Gibt es eine native Möglichkeit, in Visual Studio C++ Express Edition zu debuggen? Danke für deine Antwort. –