二进制搜索树插入在C中无法正常运行(可能是无知错误)

时间:2015-03-13 14:41:49

标签: c data-structures binary-tree

我试图在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);

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

当我插入Tree时,我调用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;
} 

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

2 个答案:

答案 0 :(得分:1)

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

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++;
}

答案 1 :(得分:0)

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

Insert应返回新创建的节点,您需要在调用者中对其执行某些操作。