为什么我的代码无法在二叉搜索树中正确执行预购表单?



我编辑了一个二叉搜索树的代码,用于字符串。但有一个小问题。当我输入一个简单的输入,如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;
}

在你的测试示例中A B C D E F你的树基本上是一个链表。首先,插入A,使其成为新根。 BA大,所以当你插入它时,它就像一个正确的孩子。所有下一个字符串都会发生同样的情况:

A -> B -> C -> D -> E -> F .

因此,当您从左侧遍历树时,您只需按原样打印列表,因为树中的任何节点中都没有左子节点。当你从右边遍历它时,你只是向后打印它。

由于您的树是不平衡的,因此这是预期的行为。从我所看到的来看,您的代码中没有错误。尝试增加平衡或制作另一个根。

最新更新