繁体   English   中英

C++ 返回指针的指针 | 二叉树按级别获取节点

[英]C++ Returning pointer of pointers | Binary Tree get nodes by level

我有这个 getTreeLevel function,效果很好。

    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)++;
        }
    }

然后我创建了另一个 function,以简化 main 的复杂性。

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;
    }

当 function 被调用时:

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

output 是:

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 的 function。 这个想法是为了降低主要的复杂程度。 理论上成功实现了。

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

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

这行不通:

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之后的 memory 位置,也就是说,指向 memory 位置,其中不存在Node object。 这可以解释为什么您会得到该节点的奇怪结果; 您通过尝试使用无效指针来调用未定义的行为。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM