문자열 용 이진 검색 트리에 대한 코드를 편집했습니다. 그러나 작은 문제가 있습니다. A B C D E F와 같은 간단한 입력을 입력하면 예약 주문 양식이 A B C D E F
...이고 실제로는 A B D E C F
이어야합니다. 그 다음 루트에있는 단어를 인쇄 예약 주문의 왼쪽 서브 트리에있는 단어를 인쇄 한 후 에서 예약 주문의 오른쪽 서브 트리를 단어를 인쇄해야하기 때문에내 코드가 바이너리 검색 트리에서 사전 주문 양식을 올바르게 수행하지 않는 이유는 무엇입니까?
.
후 주문도 D E B F C A
를 인쇄하지만 A B C D E F
을 인쇄하고에 주문 D B E A F C
를 인쇄해야했습니다 ...하지만 그냥 나에게 F E D C B A
을 준해야한다.
도움이되었는데, 무엇이 잘못되었는지는 모르겠다.
#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;
}
디버거. 디버거를 사용하십시오. 디버거를 사용하면 각 문을 한 번에 하나씩 실행하고 변수의 * watch * 값을 실행할 수 있습니다. 디버거를 사용한 후 의심스러운 성명에 대한 세부 정보와 함께 게시물을 편집하십시오. –
안녕하세요 @ ThomasMatthews 나는 디버거를 사용하는 방법에 대해 확실히 모르겠습니다. Visual Studio C++ Express 버전에서 디버깅 할 수있는 기본 방법이 있습니까? 답장을 보내 주셔서 감사합니다. –