[英]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.