问题:当指针处于嵌套结构时,如何在BST中插入项目?
语言:仅限C语言。
我知道二进制搜索树以及如何进行插入删除和打印。但这次我有嵌套结构,内部结构包含指针。所以我需要帮助/提示如何做到这一点。
传统上我们有这样的结构
struct node
{
int data;
struct node* left;
struct node* right;
}
要在适当的位置插入节点,就像这样
struct node* insert(struct node* node, int data)
{
if (node == NULL)
{
// code to implement root code;
node = create_node();
}
else
{
// 2. Otherwise, recur down the tree
if (data <= node->data)
{
node->left = insert(node->left, data);
}
else
{
node->right = insert(node->right, data);
}
return(node);
}
}
但我现在拥有的是嵌套结构
struct link
{
struct link *left;
struct link *right;
};
struct item
{
struct link link;
uint8_t c;
};
由于此处项目没有左右指针,我将如何以递归方式插入项目。 我的尝试
struct item* insert_item( item* root, uint8_t key )
{
if( !root )
{
root = create_item( key ); // some function create_item to create first item
}
/* Otherwise, recur down the tree */
else
{
if( key < root->c )
{
insert_item( ); // The node does not have pointer ?? how would I traverse left or right?
}
else
{
// how would I apply recursive to right side of tree?
}
}
return root;
}
答案 0 :(得分:1)
在insert_item()
中使用类似的东西向左或向右移动:
root.link->left
root.link->right
但请记住,在您的insert
方法中,除了void
之外,您将返回*node
,就像传统插入一样。
注意,由于struct node* insert(struct node* node, int data)
时没有return
声明,您的node == NULL
会提供Undefined Behavior。
编辑:正如OP在评论中提到的那样,&#34;但是root.link-&gt; left属于link类型。它将如何运作?&#34;
所以改变
struct link
{
struct link *left;
struct link *right;
};
要,
struct link
{
struct item *left;
struct item *right;
};
这将解决您的问题。但请不要忘记struct item
的前瞻性声明。否则在struct link
编译器中会出现错误,因为它不知道item
是什么。
答案 1 :(得分:1)
解决方案是使用演员表。
int insert(struct link** node, uint8_t data) {
if (*node == NULL) {
// code to implement root code;
*node = malloc( sizeof(struct item) );
if(*node == NULL) return -1;
( (struct item*) *node)->c = data;
( (struct item*) *node)->link.left = ( (struct item*) *node)->link.right = NULL;
} else {
// 2. Otherwise, recur down the tree
int rc;
if (data <= ( (struct item*) *node)->c) {
rc = insert(&( ( (struct item*) *node)->link.left ), data);
if( rc < 0 ) return rc;
} else {
rc = insert(&( ( (struct item*) *node)->link.right ), data);
if( rc < 0 ) return rc;
}
}
return 0;
}
请注意,我对您的代码进行了一些更改。也就是说,我不再认为未分配node->left
和node->right
。