İkili arama ağacı postorder ve preorder dolaşımları yanlış

oy
1

Ben inorder ön siparişe, postorder ve benim ikili arama ağacı baskı gereken yere bu ödev üzerinde çalışıyorum. Ancak, sadece benim inorder yöntemi çalışıyor gibi görünüyor. İşimi kontrol etmek şu test vakası kullandık.

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

Aşağıda benim kod bakmak ve yanlış yapıyorum görebiliyor. Herhangi bir yardım / yönlendirme takdir. Sen sadece bana ben yanlış yapıyorum bildirin Benim için bunu çözmek gerekmez. Teşekkürler.

#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;
}
Oluştur 13/03/2011 saat 06:30
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
1

Kodunuz doğrudur. Ama nerede ana () fonksiyonu nedir?

Cevap 13/03/2011 saat 07:37
kaynak kullanıcı

oy
1

Sen yanlış bir şey yapıyoruz. Ben derleme var ve gayet iyi çalışıyor ve bu testler geçer. o derlenmiş ve doğru olarak yapıları başlatıldı yüzden sadece ona ekleme - Sana verilen kod tek bir değişiklik yapmak zorunda değildi.

Eğer atama emin olun left/ rightişaretçileri NULLiçin yapıcı içinde TreeNodeve düzgün olarak D düğüm geçmek root. Ayrıca aracılığıyla oluşturduğunuz herhangi düğümleri silmeyi unutmayın new TreeNode. Eğer yığın (olmadan normal bir yerel değişken onları oluşturursanız new), tabii ki bunları silmek zorunda değilsiniz.

Cevap 13/03/2011 saat 07:41
kaynak kullanıcı

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