我试图在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;
}
任何人都可以帮助我理解我做错了吗?
答案 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应返回新创建的节点,您需要在调用者中对其执行某些操作。