簡體   English   中英

使用指針將節點插入二叉樹

[英]Inserting node into binary tree using pointers

我正在嘗試創建一種使用以下結構將節點插入 BST 的方法:

// node structure
struct Node {
    int val;
    struct Node* left;
    struct Node* right;
};

// binary tree structure
struct BinaryTree {
    struct Node* root;
};

最初我創建了這個方法來向樹添加節點:

// add value to binary tree
void _AddNode(struct Node* node, int val) {
    if (node == NULL)
        *(&node) = CreateNode(val);
    else if (val <= node->val)
        _AddNode(node->left, val);
    else
        _AddNode(node->right, val);
}
void AddNode(struct BinaryTree* tree, int val) {
    _AddNode(tree->root, val);
}

使用此函數構建樹時,當我嘗試遍歷、打印、訪問樹中的數據時,出現Segmentation fault: 11錯誤。

但是,當我修改函數以傳入雙指針並有效地執行相同的操作時:

// add value to binary tree
void _AddNode(struct Node** node, int val) {
    if (*node == NULL)
        *node = CreateNode(val);
    else if (val <= (*node)->val)
        _AddNode(&(*node)->left, val);
    else
        _AddNode(&(*node)->right, val);
}
void AddNode(struct BinaryTree* tree, int val) {
    _AddNode(&tree->root, val);
}

為什么后者有效,而前者無效。

但是,當我修改函數以傳入雙指針並有效地執行相同的操作時

在根本不同的數據上,本質上是相同的。 您最初嘗試中的(&node)為您提供了一個指向局部變量的指針。 當您取消引用它並分配給結果時,您正在修改局部變量。 這種修改對調用者來說是不可見的。

另一方面,如果你傳遞(比如)一個合適的雙指針到你的函數,比如_AddNode(&(*node)->left, 42) ,那么函數參數的值指向同樣的東西: (*node)->left呼叫者的(*node)->left 如果您取消引用該指針並分配給結果,那么調用者自然可以看到它。

看來原來和修改后的功能都是一樣的

顯然,它們在詞匯上並不相同。 您似乎是說它們在您看來是等價的,但是由於行為上的差異證明了這種等價性,因此這兩個函數的明顯差異實際上會產生不同的語義是合情合理的。 似乎讓您感到困惑的關鍵是,在 C 中,函數參數始終按值傳遞,因此每個函數參數都以調用者傳遞的開頭,但不是調用者相應參數的別名。 指針類型的參數也不例外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM