Binärer Suchbaum und Postorder PreOrder Querungen sind falsch

stimmen
1

Ich arbeite an diesem Hausaufgabe, wo ich meinen binären Suchbaum in Preorder, Postorder und inorder zu drucken. Allerdings scheint es, wie nur meine Inorder Methode funktioniert. Ich habe den folgenden Testfall verwendet meine Arbeit zu überprüfen.

http://www.theteacher99.btinternet.co.uk/theteacher/newalevel/cp4_5_4.htm

Können Sie einen Blick auf mein Code unten nehmen und sehen, was ich falsch mache. Jede Hilfe / Orientierung würde geschätzt. Sie haben es nicht für mich zu lösen, lassen Sie es mich wissen, was ich falsch mache. Vielen Dank.

#include <iostream>
#include <fstream>
#include <cstddef>
#include <string>
#include <sstream>
#include <string>

using namespace std;

struct TreeNode
{
    string item;
    TreeNode *left;
    TreeNode *right;
};

class BinarySortTree
{
public:
    BinarySortTree();
    void readFile(string fileName);
    void insert(string key);
    void preorder();
    void postorder();
    void inorder();
    void test();

private:
    TreeNode *root;
    void insert(string key, TreeNode *node);
    void preorderTraverse(TreeNode *node);
    void postorderTraverse(TreeNode *node);
    void inorderTraverse(TreeNode *node);
};


//default constructor, create new binary tree
BinarySortTree::BinarySortTree()
{
    root = NULL;
}

//reads the file and puts items in the tree
void BinarySortTree::readFile(string fileName)
{
    ifstream inputStream(fileName.c_str());

    if(inputStream.is_open())
    {
        string line;

        while( getline(inputStream, line) )
        {
            insert(line);
        }
    }
}

void BinarySortTree::insert(string key)
{
    if(root != NULL)
    {
        insert(key, root);
    }
    else
    {
        root = new TreeNode;
        root->item = key;
        root->left = NULL;
        root->right = NULL;
    }
}

void BinarySortTree::insert(string key, TreeNode *node)
{
    bool done = false;

    while(!done)
    {
        if(key.compare(node->item) < 0)
        {
            if(node->left != NULL)
            {
                node = node->left;
            }
            else
            {
                node->left = new TreeNode;
                node->left->item = key;
                node->left->left = NULL;
                node->left->right = NULL;
                done = true;
            }
        }
        else if(key.compare(node->item) > 0)
        {
            if(node->right != NULL)
            {
                node = node->right;
            }
            else
            {
                node->right = new TreeNode;
                node->right->item = key;
                node->right->left = NULL;
                node->right->right = NULL;
                done = true;
            }
        }
        else if(key.compare(node->item) == 0)
        {
            done = true;
        }
    }
}

void BinarySortTree::preorder()
{
    cout << PreOrder Traversal << endl;
    preorderTraverse(root);
    cout << endl;

}

/*
   1. Start at the root node
   2. Traverse the left subtree
   3. Traverse the right subtree
*/
void BinarySortTree::preorderTraverse(TreeNode *node)
{
    if(node != NULL)
    {
        cout << node->item <<  ;
        preorderTraverse(node->left);
        preorderTraverse(node->right);
    }

}

void BinarySortTree::postorder()
{
    cout << PostOrder Traversal << endl;
    postorderTraverse(root);
    cout << endl;
}

/*
   1. Traverse the left subtree
   2. Traverse the right subtree
   3. Visit the root node
*/
void BinarySortTree::postorderTraverse(TreeNode *node)
{
    if(node != NULL)
    {
        postorderTraverse(node->left);
        postorderTraverse(node->right);
        cout << node->item <<  ;
    }
}

void BinarySortTree::inorder()
{
    cout << InOrder Traversal << endl;
    inorderTraverse(root);
    cout << endl;
}

/*
   1. Traverse the left subtree
   2. Visit the root node
   3. Traverse the right subtree
*/
void BinarySortTree::inorderTraverse(TreeNode *node)
{
    if(node!= NULL)
    {
        inorderTraverse(node->left);
        cout << node->item <<  ;
        inorderTraverse(node->right);
    }
}

void BinarySortTree::test()
{
    cout << root->item << endl;
}


int main()
{
    string fileName = a4.txt;
    BinarySortTree bst;
    bst.readFile(fileName);
    bst.test();

    bst.preorder();
    bst.postorder();
    bst.inorder();

    return 0;
}
Veröffentlicht am 13/03/2011 um 06:30
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Ihr Code korrekt ist. Aber wo ist die Funktion main ()?

Beantwortet am 13/03/2011 um 07:37
quelle vom benutzer

stimmen
1

Sie tun nichts falsch. Ich habe es kompilieren, und es funktioniert gut, und übergibt diese Tests. Ich habe nicht eine einzige Änderung am Code vornehmen Sie zur Verfügung gestellt - nur, um es hinzuzufügen, damit es die Strukturen richtig kompiliert und initialisiert.

Stellen Sie sicher , dass Sie Ihr zuweisen left/ rightZeiger NULLin Ihrem Konstruktor TreeNode, und übergeben Sie richtig in dem D - Knoten als root. Denken Sie auch daran alle Knoten zu löschen , die Sie über erstellen new TreeNode. Wenn man sie auf dem Stapel (normalen lokalen Variable ohne erstellen new), können Sie natürlich müssen sie nicht löschen.

Beantwortet am 13/03/2011 um 07:41
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more