GNU libavl 2.0.1
Author: Ben Pfaff

8.6 Copying |

We can use the tree copy function for TBSTs almost verbatim here. The one necessary change is that copy_node() must copy node balance factors. Here's the new version:

    328. <TAVL node copy function 328> =
    static int
    copy_node (struct tavl_table *tree,
               struct tavl_node *dst, int dir,
               const struct tavl_node *src, tavl_copy_func *copy)
    {
      struct tavl_node *new =
        tree->tavl_alloc->libavl_malloc (tree->tavl_alloc, sizeof *new);
      if (new == NULL)
        return 0;

      new->tavl_link[dir] = dst->tavl_link[dir];
      new->tavl_tag[dir] = TAVL_THREAD;
      new->tavl_link[!dir] = dst;
      new->tavl_tag[!dir] = TAVL_THREAD;
      dst->tavl_link[dir] = new;
      dst->tavl_tag[dir] = TAVL_CHILD;

      new->tavl_balance = src->tavl_balance;
      if (copy == NULL)
        new->tavl_data = src->tavl_data;
      else
        {
          new->tavl_data = copy (src->tavl_data, tree->tavl_param);
          if (new->tavl_data == NULL)
            return 0;
        }

      return 1;
    }

This code is included in 329.

    329. <TAVL copy function 329> =
    <TAVL node copy function 328>
    <TBST copy error helper function; tbst => tavl 280>
    <TBST main copy function; tbst => tavl 279>

This code is included in 300 and 336.

8.5.6 Finding the Parent of a Node | 8 Threaded AVL Trees | 8.7 Testing