c ++ значение не сохраняется в указатель (дерево двоичного поиска) - PullRequest
0 голосов
/ 13 декабря 2018

Для класса мы строим дерево двоичного поиска.Я полагаю, что смогу получить основную часть проекта самостоятельно (isPresent, оценить и т. Д.), Но у меня возникают проблемы при создании самого дерева.Учитывая входные данные из main:

int main()
{
    BST *bst = new BST();
    bst->add(20, "*");
    bst->add(15, "-");
    bst->add(6, "+");
    bst->add(30, "/");
    bst->add(8, "2");
    bst->add(2, "4");
    bst->add(25, "14");
    bst->add(36, "7");
    bst->add(18, "3");

    cout << ((bst->isPresent(20)) ? "20 - Yes" : "20 - No") << endl;
    cout << ((bst->isPresent(8)) ? "8 - Yes" : "8 - No") << endl;
    cout << ((bst->isPresent(200)) ? "200 - Yes" : "200 - No") << endl;

Затем мы должны использовать предоставленный им BST.h, но к которому мы можем добавить информацию (которую я уже добавил совсем немного):

class BST
{
public:

    BST();
    void add(int key, string oper);
    bool isPresent(int key) const;

private:


    class Node
    {
    public:
        friend class BST;
        Node()
        {
            mLeft = mRight = nullptr;
            mKey = NULL;
            mOper = "NULL";
            mToken = 0;
        }

        Node(int key, string oper)
        {
            mLeft = mRight = nullptr;
            mKey = key;
            mOper = oper;
            mToken = 0;
        }
        bool find(int x);  // Delete if you don't want it.
        void insert(int key, string oper);

    private:
        Node *mLeft, *mRight;
        int mKey = 0;
        string mOper = "";
        double mToken = 0;
        Node *mRoot;
        Node *helper;
    };
};

В BST.cpp, который можно изменить любым способом, у меня есть

BST::BST()
{
    int key = 0;
    string oper = "NULL";
}


void BST::add(int key, string oper)
{
    Node useThis = Node();
    useThis.insert(key, oper);

}

bool BST::isPresent(int key) const
{
    BST useThis = BST();
    return useThis.find(key);
}

void BST::Node::insert(int key, string oper)
{
    if (mRoot == NULL)
    {
        mRoot = new Node();
        mRoot->mKey = key;
        mRoot->mOper = oper;
        mRoot->mToken;
        mRoot->mLeft = mRoot->mRight = NULL;
        cout << "Finished setting mRoot";
    }


    else
    {
        helper = new Node();
        helper->mKey = key;
        helper->mOper = oper;
        helper->mToken;
        helper->mLeft = mRoot->mRight = NULL;


        if (helper->mToken < mRoot->mToken)
        {
            if (mRoot->mLeft == NULL)
            {
                mRoot->mLeft = helper;
            }
            else
            {
                mRoot->insert(mRoot->mLeft->mKey, mRoot->mLeft->mOper);
            }
        }
        else
        {
            if (mRoot->mRight == NULL)
            {
                mRoot->mRight = helper;
            }
            else
            {
                mRoot->insert(mRoot->mRight->mKey, mRoot->mRight->mOper);
            }
        }
    }
}

Введен только соответствующий код Я замечаю, что каждый раз, когда яперейти к добавлению, похоже, что mRoot был сброшен, и код продолжает пытаться установить mRoot в значения, которые я отправляю каждый раз (нажимает if (mRoot == NULL) несколько раз).Я надеялся выяснить, почему значение, введенное мною для mRoot, не сохраняется при переходе к методу поиска

1 Ответ

0 голосов
/ 13 декабря 2018

В этой функции

void BST::add(int key, string oper)
{
    Node useThis = Node();
    useThis.insert(key, oper);

}

Вы каждый раз создаете новый узел и вызываете вставку на него.А после завершения функции добавления все, что вы сделали, потеряно.

Учитывая, что вы хотите иметь только одну корневую точку, лучше всего создать этот узел только один раз и запомнить его (или подумать еще раз, если вам действительно нужноесть Splitt Node и BST).Просто сделайте это частным параметром для вашего BST и вызовите insert для него.

...