簡體   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