【问题标题】:C++ Returning pointer of pointers | Binary Tree get nodes by levelC++ 返回指针的指针 |二叉树逐级获取节点
【发布时间】:2021-11-30 16:31:18
【问题描述】:

我有这个 getTreeLevel 函数,效果很好。

    void getTreeLevel(int level, int * size, Node* current, Node** result) {
        if (current == NULL) {
            return;
        }
        if (level > 0) {
            getTreeLevel(level - 1, size, current->left, result);
            getTreeLevel(level - 1, size, current->right, result);
        }
        if (level == 0) {
            cout << "Get Level Tree: Adding node to array " << current->val << endl;
            **(result) = *current; 
            (*size)++;
            (*result)++;
        }
    }

然后我创建另一个函数,以简化主函数的复杂性。

Node** getLevel(int level, int * size) {
        Node* emptyNode = new Node;
        *size = 0;
        getTreeLevel(level, size, root, &emptyNode);
        cout << "There are " << *size << " nodes in the level" << endl;
        for (int i = 0; i < *size; i++) {
            emptyNode--;
            cout << emptyNode << " <-> ";
        }
        cout << endl;
        return &emptyNode;
    }

当函数在 main 中被调用时:

int* size = new int;
    Node ** emptyNode = tree.getLevel(0,size);
    while (*size > 0) {
        cout << (*emptyNode) << " - ";
        (*emptyNode)++;
        (*size)--;
    }
    cout << endl;

输出是:

10 - 5 - 4 - 15 - 14 - 16 -
Get Level Tree: Adding node 4
Get Level Tree: Adding node 14
Get Level Tree: Adding node 16
There are 3 nodes in the level
0000021DE92DC850 <-> 0000021DE92DC830 <-> 0000021DE92DC810 <-> // If I change the cout << (*emptyNode) << " - " for cout << (*emptyNode)->value << " - " then I would get 16 <-> 14 <-> 4 <->
0000021DE92DC810 - 0000000000000023 - 0000000000000023 -

简而言之:这是二叉树的一个片段。 我试图实现一个使用 getTreeLevel 的函数。这个想法主要是降低复杂性。 理论上实现成功。

这里的问题是数组种类在函数之外消失了。 我们创建一个指针,然后将该指针的内存地址作为参数发送到函数中。 完成后,我们向后打印数组(或地址内存,在这种情况下)以返回指向数组开头的指针并返回它。 一旦返回,只有“头”或第一个内存地址保持不变。但是相邻的地址内存好像变了!

您能推荐我什么来解决这个问题? 谢谢

【问题讨论】:

    标签: c++ pointers binary-tree


    【解决方案1】:

    这行不通:

    void getTreeLevel(int level, int * size, Node* current, Node** result)   
    {
        [...]
            (*result)++;
    }
    

    推理:既然result是一个Node **,那么*result就是一个Node *,即指向一个Node的指针。到目前为止,一切都很好,但是现在您正在递增该指针,这是一个仅在指针指向数组中的条目时才有意义的操作。但至少在一种情况下,它显然不是数组中的条目:

        Node* emptyNode = new Node;
        *size = 0;
        getTreeLevel(level, size, root, &emptyNode);
    

    ...所以getTreeLevel()返回后,emptyNode指向的是new Node之后的内存位置,也就是说,指向一个不存在Node对象的内存位置。这可以解释为什么你会在那个节点上得到奇怪的结果;您通过尝试使用无效指针来调用未定义的行为。

    要修复它,您需要确保传递给函数的Node ** 指向Node * 数组中的一个条目(而不仅仅是单独分配的@ 987654332@),或者您需要重新设计您的算法,使其不会对该参数进行指针算术运算。

    侧节点:new 的以下用法是不必要的:

    int* size = new int;
    Node ** emptyNode = tree.getLevel(0,size);
    

    通过这样做,您将获得更好的性能(并避免内存泄漏!):

    int size = 0;
    Node ** emptyNode = tree.getLevel(0,&size);
    

    【讨论】:

      猜你喜欢
      • 2015-07-18
      • 2019-03-12
      • 1970-01-01
      • 2021-07-22
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 2021-03-06
      相关资源
      最近更新 更多