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