Binarne drzewo poszukiwań PostOrder preorder i przechodzenia między mylą

głosy
1

Pracuję w tej pracy domowej, gdzie trzeba wydrukować kryteria wyszukiwania binarne drzewo w przedsprzedaży, postorder i Inorder. Jednak wydaje się, że tylko moja metoda Inorder działa. Użyłem następujący przypadek testowy, aby sprawdzić moją pracę.

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

Można spojrzeć na mojego kodu poniżej i zobacz, co robię źle. Każda pomoc / orientacja będą mile widziane. Nie trzeba go rozwiązać dla mnie, po prostu daj mi znać, co robię źle. Dzięki.

#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;
}
Utwórz 13/03/2011 o 06:30
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
1

Twój kod jest poprawny. Ale gdzie jest główna funkcja ()?

Odpowiedział 13/03/2011 o 07:37
źródło użytkownik

głosy
1

Robisz nic złego. Mam to kompilacja, i to działa dobrze, i przekazuje te testy. Nie trzeba wprowadzać pojedyncze zmiany w kodzie, który podałeś - wystarczy dodać do niego tak skompilowany i zainicjowany struktur poprawnie.

Upewnij się przypisać left/ rightwskazówek, aby NULLw konstruktorze TreeNode, a właściwie przekazać w węźle D jak root. Należy również pamiętać, aby usunąć wszelkie węzły utworzone przez new TreeNode. Jeśli utworzysz je na stosie (normalny zmiennej lokalnej bez new), to oczywiście nie trzeba ich usuwać.

Odpowiedział 13/03/2011 o 07:41
źródło użytkownik

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