簡體   English   中英

創建二叉搜索樹結構並在 C 中正確初始化

[英]creating a binary search tree struct and initializing it properly in C

所以我試圖在 C 中創建一個二叉搜索樹,但我有點困惑並且遇到了問題。 這是我的結構的樣子:

typedef struct {
    void* item;
    struct Node** nodes;
}Node;

typedef struct{
    Node* tree_root; 
    int depth; 
    int item_size; 
} BST;
 

所以在這種情況下,我沒有為樹初始化左右節點,而是有一個“2D”數組Nodes** nodes ,其中nodes[0]是我在樹上的左節點, nodes[1]是我的右節點在樹上。 我認為我沒有正確初始化它,因為每次我嘗試將一個項目插入樹中時,我都會收到一個sgmentation fault(core dumped)作為錯誤。 下面是我創建節點和初始化樹的方法: // 創建包含項目的節點,返回它的引用。

Node* createNode(void* item){
        Node *new_node;

    if ((new_node = malloc(sizeof(Node))) == NULL)
        return NULL;

    new_node->item = item;
    new_node->nodes[0] = NULL;
    new_node->nodes[1] = NULL;

    return new_node;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Initializes the fields on the BST. Returns nothing.
void initBinaryTree(BST* tree, int item_size){
Node* root = NULL;
root = (Node *)malloc(sizeof(Node));
Node* left = NULL;
root = (Node *)malloc(sizeof(Node));
Node* right = NULL;
root = (Node *)malloc(sizeof(Node));

tree->tree_root = root;
tree->tree_root->nodes[0] = left;
tree->tree_root->nodes[1] = right;
tree->item_size = item_size;
tree->depth = 0;

}

所以我只是想為節點創建 memory 空間,這樣我就可以把東西放在那里,我假設我不能插入任何東西的唯一原因是因為,我認為,這里的某個地方我沒有做正確的事情。 所以我想知道你們是否可以就我在這里做錯或可能做錯的事情給我任何建議。 任何幫助表示贊賞!

您分配了一個Node ,但您從不為nodes成員分配指向的空間。

例如,當您訪問new_node->nodes[0]時,您正在取消引用nodes成員以訪問數組中的指針,但沒有數組,因為nodes不指向任何東西。

將您的Node定義更改為:

typedef struct {
    void* item;
    struct Node *nodes[2];
}Node;

使nodes成為一個數組,這樣您就不必為它分配空間。

您在initBinaryTree中也有拼寫錯誤:

Node* root = NULL;
root = (Node *)malloc(sizeof(Node));
Node* left = NULL;
root = (Node *)malloc(sizeof(Node));
Node* right = NULL;
root = (Node *)malloc(sizeof(Node));

這應該是:

Node* root = NULL;
root = (Node *)malloc(sizeof(Node));
Node* left = NULL;
left = (Node *)malloc(sizeof(Node));
Node* right = NULL;
right = (Node *)malloc(sizeof(Node));

但是......初始化樹時不應該創建空白節點。 root成員應該以 NULL 開頭,然后像NULL一樣添加節點。

暫無
暫無

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

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