Binary Search Albero postorder e preordine Attraversamento sono sbagliate

voti
1

Sto lavorando a questo lavoro in cui ho bisogno di stampare il mio albero binario di ricerca in preordine, postorder e simmetrico. Tuttavia, sembra che solo il mio metodo simmetrico sta lavorando. Ho usato il seguente banco di prova per verificare il mio lavoro.

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

Si può dare un'occhiata al mio codice qui sotto e vedere quello che sto facendo male. Qualsiasi aiuto / orientamento sarebbe apprezzato. Non è necessario risolvere per me, fammelo sapere che cosa sto facendo male. Grazie.

#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;
}
È pubblicato 13/03/2011 alle 06:30
fonte dall'utente
In altre lingue...                            


2 risposte

voti
1

Il vostro codice è corretto. Ma dove è la funzione main ()?

Risposto il 13/03/2011 a 07:37
fonte dall'utente

voti
1

Si sta facendo nulla di male. Ho preso la compilazione, e funziona benissimo, e passa i test. Non ho dovuto fare una sola modifica al codice che hai fornito - basta aggiungere ad esso in modo che compilato e inizializzato correttamente le strutture.

Assicurati di assegnare le vostre left/ rightpuntatori a NULLnel costruttore per TreeNode, e passare correttamente nel nodo D come root. Ricorda anche di eliminare tutti i nodi creati via new TreeNode. Se li si crea sullo stack (variabile locale normale senza new), è, naturalmente, non c'è bisogno di eliminarli.

Risposto il 13/03/2011 a 07:41
fonte dall'utente

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