Binary Recherche Arbre Postorder et Traversées Précommande ont tort

voix
1

Je travaille sur ce travail à domicile où je dois imprimer mon arbre de recherche binaire en pré-commande, postorder et afinde. Cependant, il semble que seule ma méthode infixe fonctionne. Je l'ai utilisé le cas de test ci-dessous pour vérifier mon travail.

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

Pouvez-vous jeter un oeil à mon code ci-dessous et voir ce que je fais mal. Toute aide / orientation serait appréciée. Vous n'êtes pas obligé de le résoudre pour moi, juste faites-moi savoir ce que je fais mal. Merci.

#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;
}
Créé 13/03/2011 à 06:30
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

Votre code est correct. Mais où est la fonction principale ()?

Créé 13/03/2011 à 07:37
source utilisateur

voix
1

Vous ne faites rien de mal. Je l'ai compilation, et il fonctionne très bien, et passe ces tests. Je ne devais pas faire un seul changement au code que vous avez fourni - il suffit d'ajouter à cela il a compilé et initialisé les structures correctement.

Assurez-vous d' attribuer vos left/ rightpointeurs vers NULLdans votre constructeur pour TreeNodeet passer correctement dans le nœud D comme root. Souvenez - vous également de supprimer tous les noeuds que vous créez via new TreeNode. Si vous les créez sur la pile (variable locale normale sans new), bien sûr , vous ne devez pas les supprimer.

Créé 13/03/2011 à 07:41
source utilisateur

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