Binary Search Tree PostOrder και το preorder διελεύσεων είναι λάθος

ψήφοι
1

Δουλεύω σε αυτό το σπίτι όπου θα πρέπει να εκτυπώσετε δυαδικό δένδρο αναζήτησης στο παραγγελίας, postorder και inorder. Ωστόσο, φαίνεται ότι μόνο η μέθοδος inorder μου δουλεύει. Έχω χρησιμοποιήσει την ακόλουθη δοκιμή για να ελέγξει τη δουλειά μου.

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

Μπορείτε να ρίξετε μια ματιά στο κωδικό μου κάτω και να δούμε τι κάνω λάθος. Οποιαδήποτε βοήθεια / προσανατολισμού θα εκτιμηθεί. Δεν χρειάζεται να το λύσει για μένα, απλά επιτρέψτε μου να ξέρω τι κάνω λάθος. Ευχαριστώ.

#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;
}
Δημοσιεύθηκε 13/03/2011 στις 06:30
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
1

Ο κωδικός σας είναι σωστή. Αλλά πού είναι η main ();

Απαντήθηκε 13/03/2011 στις 07:37
πηγή χρήστη

ψήφοι
1

Θα κάνουν τίποτα λάθος. Πήρα την κατάρτιση, και δουλεύει μια χαρά, και περνά αυτές τις δοκιμές. Δεν είχα να κάνω μια απλή αλλαγή στον κώδικα που παρέχεται - απλά να προσθέσω σε αυτό, ώστε να συνταχθεί και να προετοιμαστεί των δομών σωστά.

Βεβαιωθείτε ότι έχετε εκχωρήσει σας left/ rightδείκτες για NULLτο κατασκευαστή σας για TreeNode, και να περάσει σωστά στον κόμβο D, όπως root. Επίσης, θυμηθείτε να διαγράψετε οποιαδήποτε κόμβους που δημιουργούν μέσω του new TreeNode. Αν τους δημιουργήσετε στη στοίβα (κανονική τοπική μεταβλητή χωρίς new), που φυσικά δεν χρειάζεται να τα διαγράψετε.

Απαντήθηκε 13/03/2011 στις 07:41
πηγή χρήστη

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