0

単純な二分探索木クラス(BST)を書き込もうとしています。

単一のノード(例:value = 10)を追加すると、ルートが更新され、BST :: insert(...)の最後にVSC++デバッガーを使用して検証しました。

次に、ノード(値-10)を表示しようとしましたが(Caseステートメント3)、何も出力されません。その理由は、getRoot()が呼び出されたときに、ルートがNULL(?? !!!)であるためです。

誰かがこの問題のデバッグを手伝ってくれませんか。

#include <iostream>
#include <stdio.h>
#include "bst_node.h"

class BST{
private:
    bst_node *root;

public:
    bst_node* getRoot();
    void insert(bst_node *, int val);
    void deleteValue(int val);
    void display(bst_node *);
    void destroy();

    BST()
    {
        root = NULL;
        std::cout<<"BST constructor"<<"\n";
    }

    ~BST()
    {
        std::cout<<"BST destructor"<<"\n";
    }
};

int main()
{
    int item;
    int choice;
    BST tree1;
    while(1)
    {
        printf("\n Choices are:\n");
        printf("\n 1.Insertbeg\n\n 2.deleteNode\n\n 3.display\n\n 4.exit\n\n");
        printf(" Enter U'r choice: ");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1: 
                {
                    printf("Enter element to be inserted: ");
                    scanf("%d",&item);
                    tree1.insert(tree1.getRoot(), item); 
                    break;
                }
            case 2:
                {
                    printf("Enter element to be deleted: ");
                    scanf("%d",&item);
//                  tree1.deleteValue(item); 
                    break;
                }
            case 3:
                {
                    tree1.display(tree1.getRoot()); 
                    break;
                }
            case 4: 
                    exit(1);
                    break;
            default: printf("INVALID CHOICE TRY AGAIN\n");
        }
    }
}

void BST::insert(bst_node* root, int val)
{
    if( root == NULL)
    {
        // add first element 
        bst_node *new_node = bst_node::create_empty_node();
        new_node->val = val;
        root = new_node;
    }

    else if(val < root->val )
    {
        insert(root->l_child, val); 
    }

    else if (val >= root->val)
    {
        insert(root->r_child, val);
    }
}

void BST::display(bst_node *root)
{
    if(root == NULL)
    {
        return;
    }
    else
    {
        std::cout << root->val <<"\n";
        display(root->l_child);
        display(root->r_child);
    }
}

void BST::deleteValue(int val)
{
    std::cout<< " Do nothing";
}

bst_node* BST::getRoot()
{
    return root;
}

bst_node.h


class bst_node
{
public:
    int val;
    bst_node *l_child;
    bst_node *r_child;
    static bst_node* create_empty_node();
};

bst_node* bst_node::create_empty_node()
{
    bst_node *new_node;
    new_node = new bst_node;
    new_node -> l_child = new_node -> r_child = NULL;
    return(new_node);
}
4

2 に答える 2

2

引数にもに名前を付けて、プライベートメンバーを非表示にしています。のすべての変更は、ローカル変数に適用されます。たとえば、次の行です。rootinsert() rootroot

root = new_node;

影響はありません。二度と使用されないvriableに新しい値を設定しています。

そうすることは通常悪い習慣です(セッターなどのいくつかの例外を除いて)。名前を変更して、問題の少なくとも一部が解決するかどうかを確認してください。

于 2012-08-26T07:14:24.427 に答える
0

またはvoid BST::insert(bst_node* root, int val) に変更void BST::insert(bst_node*& root, int val)void BST::insert(bst_node** root, int val)

関数に他の変更を加えないで最も簡単なのは、bst_node *&を使用することです。

ポインター自体は関数に渡される整数であり、このポインターがコピーされるため、ポインターの値を変更しても、関数のスコープ外では変更されません。ポインタを参照すると、関数スコープ外で変更を利用できるようになります。

于 2012-08-26T07:17:51.670 に答える