Binární vyhledávací strom postorder a předobjednávku traversals jsou špatné

hlasů
1

Jsem pracující na tomto úkoly, kde musím vytisknout svůj strom binárního vyhledávání v předobjednávku, postorder a nezbytného. Nicméně se zdá, že pouze pracuje můj způsob nezbytného. Použil jsem následující modelový případ zkontrolovat svou práci.

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

Můžete se podívat na níže můj kód a uvidíme, co dělám špatně. Jakákoliv pomoc / orientace by ocenili. Nemusíte řešit to pro mě, dej mi vědět, co dělám špatně. Dík.

#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;
}
Položena 13/03/2011 v 06:30
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Váš kód je správný. Ale kde je hlavní funkcí ()?

Odpovězeno 13/03/2011 v 07:37
zdroj uživatelem

hlasů
1

Děláte nic špatného. Mám to kompilaci, a to funguje, a předává tyto testy. Neměl jsem udělat jednu změnu ke kódu, kterou jste uvedli - stačí přidat k němu tak, že zkompilovaný a správně inicializovat struktury.

Ujistěte se, že přiřadit left/ rightukazatelů NULLv konstruktoru TreeNode, a řádně předat D uzlu jako root. Také si pamatuji, aby odstranit všechny uzly, které vytvoříte pomocí new TreeNode. Pokud vytvoříte je na stacku (normální lokální proměnné bez new), ty samozřejmě nemají na jejich odstranění.

Odpovězeno 13/03/2011 v 07:41
zdroj uživatelem

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