我编辑了二进制搜索树的代码,用于字符串。但是有一个小问题。当我输入一个像A B C D E F这样的简单输入时,我的程序说预订表格是A B C D E F
......实际应该是A B D E C F
。
因为,它应该在根处打印单词然后按预先顺序在左子树上打印单词然后打印单词at at 预订中的正确子树。
也可以打印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;
}
答案 0 :(得分:1)
在您的测试示例A B C D E F
中,您的树基本上是一个链接列表。首先,您插入A
,因此它将成为您的新根。 B
大于A
,因此当您插入它时,它会成为一个正确的孩子。所有下一个字符串也是如此:
A
- &GT; B
- &GT; C
- &GT; D
- &GT; E
- &GT; F
< / p>
因此,当您从左侧遍历树时,您只需按原样打印列表,因为树中的任何节点中都没有左子节点。当您从右侧移动它时,您只需向后打印它。
由于您的树不平衡,这是预期的行为。我所看到的代码中没有错误。尝试添加平衡或创建另一个根。