Binary Search Tree Insert Not Functioning Correctly in C (可能是一个无知的错误)

Binary Search Tree Insert Not Functioning Correctly in C (possibly an ignorant error)

我正在尝试用 C 语言创建 BST 树结构,但我在插入函数工作时遇到了一些困难。阅读一些示例后,我发现最好的方法是传递一个指向树根的指针,然后递归地插入该节点,直到找到一个空节点 (NULL)。但是,我试图传递整个树结构(只是为了将所有内容都整齐地封装起来),我想我想出了以下解决方案:

void insert(struct Node* temp, char *s){

if (temp  == NULL) {
  struct Node *newNode = make_node();
  newNode-> data = strdup(s);
  temp = newNode;
  return;


}
 if (strcmp(s,temp->data) > 0) {
  temp = temp->left;
  insert(temp, s);
  }
 if (strcmp(s,temp->data) < 0) {
   temp = temp->right;
   insert(temp, s);
  }

 }
//--------------------------------------------------------------                                      
 void insert_tree(struct BSP * tree, char *s) {

    struct Node *temp = tree->root;
    insert(temp, s);

 }
//------------------------------------------------------------- 

当我插入到树中时,我调用了 insert_tree(),但随后我使用 insert() 作为递归插入应指向树根的节点的方法。 P.S BSP 的结构和节点是:

typedef struct Node {
   struct Node * left;
   struct Node * right;
   char * data;

 } node;

 typedef struct BSP {
  struct Node * root;
  int size;
} 

任何人都可以帮助我理解我做错了什么吗?

您的问题是您正在丢弃新节点。在 C 函数中,参数是按值传递的,这意味着在插入函数中更改 temp 不会在调用者中更改它。

插入应该 return 新创建的节点,您需要在调用者中对其进行一些操作。

第一个答案是正确的,但你总是可以使用指针指向指针,就像这样。

typedef struct Node
{
    Node()
    {
        left = NULL;
        right = NULL;
        data = NULL;
    }

    struct Node* left;
    struct Node* right;
    char* data;
} node;

typedef struct BSP
{
    BSP()
    {
        root = NULL;
        size = 0;
    }

    struct Node* root;
    int size;
} bsp;

void insert(struct Node** temp, char* s)
{
    Node* node = *temp;

    if (node == NULL)
    {
        struct Node* newNode = new Node();
        newNode->data = strdup(s);
        (*temp) = newNode;
        return;
    }

    if (strcmp(s, node->data) > 0)
    {
        insert(&node->left, s);
    }

    if (strcmp(s, node->data) < 0)
    {
        insert(&node->right, s);
    }
}

void insert_tree(struct BSP* tree, char* s)
{
    insert(&tree->root, s);
    tree->size++;
}