BST插入C ++帮助

时间:2011-09-22 05:28:50

标签: c++ insert tree

typedef struct treeNode {
    treeNode* left;
    treeNode* right;
    int data;
    treeNode(int d) {
        data = d;
        left = NULL;
        right = NULL;
    }
}treeNode;

void insert(treeNode *root, int data) {
    if (root == NULL) {
        cout << &root;
        root = new treeNode(data);
    }
    else if (data < root->data) {
        insert(root->left, data);
    }
    else {
        insert(root->right, data);
    }
}

void inorderTraversal(treeNode* root) {
    if (root == NULL)
        return;
    inorderTraversal(root->left);
    cout<<root->data;
    inorderTraversal(root->right);
}

int main() {
    treeNode *root = new treeNode(1);
    cout << &root << endl;
    insert(root, 2);
    inorderTraversal(root);

    return 0;
}

所以我很累,但是我正在为面试准备工作提出一些练习题,并且出于某种原因,这个BST插件没有打印出任何节点被添加到树中。它可能是我用指针掩盖的东西,但我无法弄明白。任何想法?

3 个答案:

答案 0 :(得分:4)

void insert(treeNode *root, int data) {
   if (root == NULL) {
   cout << &root;
   root = new treeNode(data);
}

一旦函数结束,对root的更改就会丢失,它不会修改作为参数传递的root,而是修改它自己的副本。

答案 1 :(得分:2)

请注意,当你插入节点时,使用指向指针(仅指针是不够的): 所以,这是固定代码:

void insert(treeNode **root, int data) {
    if (*root == NULL) {
        cout << root;
        *root = new treeNode(data);
    }
    else if (data < (*root)->data) {
        insert(&(*root)->left, data);
    }
    else {
        insert(&(*root)->right, data);
    }
}

主要是:

int main() {
    treeNode *root = new treeNode(1);
    cout << &root << endl;
    insert(&root, 2);
    inorderTraversal(root);

    return 0;
}

答案 2 :(得分:0)

你的逻辑是正确的!

唯一的问题是,当您创建局部变量时,即使它是指针,其范围也是函数的本地变量。在你的主要:

...
insert(root, 2);
...

函数调用发送root的副本,该副本是指向treeNode的指针(不是root的地址)。请注意

void insert(treeNode *root, int data)

获取treeNode指针作为参数(不是指针的地址)。 注意:此函数调用可能看起来像“通过指针调用”(或引用),但它实际上是“按值调用”。您在main函数中定义的rootroot方法中的insert在堆栈(内存)中具有不同的地址,因为它们是不同的变量。前者在内存中的主函数堆栈中,而后者在insert方法中。因此,一旦函数调用insert完成执行,其堆栈就会被清空,包括局部变量root。有关内存的更多详细信息,请参阅:stacks/heaps

当然,您使用以下内容分配的内存中的数据:

*root = new treeNode(data);

仍然停留在堆中,但是一旦你离开insert函数,你就失去了对它的引用(地址)。

解决方案将原始root的地址传递给该函数并进行修改( K-ballo dip 已建议)或从函数返回修改后的本地root。对于第一种方法,请参阅他/她的答案中 dip 所写的代码。

我个人更喜欢从函数中返回修改后的root,因为我觉得它更方便,特别是在实现其他常见的BST算法时。这是您的功能,稍微修改了原始代码:

treeNode* insert(treeNode *root, int data) {
    if (root == NULL) {            
        root = new treeNode(data);
    }
    else if (data < root->data) {
        root->left=insert(root->left, data);
    }
    else {
        root->right=insert(root->right, data);
    }

    return treeNode;
}

main中的函数调用将是:

int main() {
    treeNode *root = new treeNode(1);
    cout << &root << endl;
    root = insert(root, 2);
    inorderTraversal(root);

    return 0;
}

希望有所帮助!