0

我在使用以下代码时遇到问题。我是一名试图自学 C++ 的 Java 开发人员。主要是我在 main() 中的代码没有向根节点插入任何内容。谁能帮我。我确信我的指针有问题。

class Node{
    public:
        Node* left;
        Node* right;
        int data;

    Node(int n){
        data = n;
        right = NULL;
        left = NULL;
    }
};

class BST{

    Node* root;

    public:

    BST(){
        root = NULL;
    }

    void insert(int e){
        pinsert(root, e);
    }

    void pinsert(Node* sr, int e){
        if(sr == NULL){
            sr = new Node(e);
        }
        else{
            if((sr->data) > e ){
                pinsert(sr->left, e);
            }
            else{
                pinsert(sr->right, e);
            }
        }
    }
};


int main(){
    BST tree;
    tree.insert(6);
    tree.insert(7);
}
4

3 回答 3

6

sr按值传递并分配给它。这不会改变你root。而是通过引用传递它:

void pinsert( Node*& sr, int e)
于 2012-09-30T19:52:42.973 回答
3

插入的问题是当您从一个空列表开始时。当您将 a 传递Node *给您的pinsert函数时,参数是按 value传递的,因此您的函数以指针的副本结束。当指针为NULL时,您将指针更改为指向您的新节点。由于您只有 in 中的指针副本pinsert,因此这只更改了指针的副本。当函数返回时,指针和列表不变。

传递对指针的引用以解决此问题:

void pinsert(Node *&sr, int e)

现在您的其余代码不需要更改,您的函数可以更改指针。

这个问题类似于在 java 中传递对象引用:您可以通过设置字段和调用方法来更改对象的内容,但不能将参数更改为新对象或null.

于 2012-09-30T19:56:54.570 回答
2

问题是它root总是 NULL,你永远不会给它分配任何东西。

当您致电pinsert(root, e)然后执行此操作时:

void pinsert(Node* sr, int e){
    if(sr == NULL){
        sr = new Node(e);
    }

您发送根副本并分配给该副本,而不是root仍然为NULL的副本。您需要通过引用 ( void pinsert(Node** sr, int e)) 发送指针 - 注意 2 'stars' 或void pinsert(Node*& sr, int e).

于 2012-09-30T19:55:05.697 回答