使用递归函数在二叉搜索树中插入项

时间:2015-06-17 10:04:57

标签: c pointers recursion binary-search-tree

问题:当指针处于嵌套结构时,如何在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;
}

2 个答案:

答案 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->leftnode->right