Steps 1-1 in RTAVL Insertion - GNU libavl 2.0.2
Author: Ben Pfaff

11.4.1 Steps 1–2: Search and Insert |

The basic insertion step itself follows the same steps as <RTBST item insertion function 377> does for a plain RTBST. We do keep track of the directions moved on stack da[] and the last-seen node with nonzero balance factor, in the same way as <Step 1: Search AVL tree for insertion point 148> for unthreaded AVL trees.

    420. <Step 1: Search RTAVL tree for insertion point 420> =
    z = (struct rtavl_node *) &tree->rtavl_root;
    y = tree->rtavl_root;
    if (tree->rtavl_root != NULL)
      for (q = z, p = y; ; q = p, p = p->rtavl_link[dir])
        {
          int cmp = tree->rtavl_compare (item, p->rtavl_data, tree->rtavl_param);
          if (cmp == 0)
            return &p->rtavl_data;

          if (p->rtavl_balance != 0)
            z = q, y = p, k = 0;
          da[k++] = dir = cmp > 0;

          if (dir == 0)
            {
              if (p->rtavl_link[0] == NULL)
                break;
            }
          else /* dir == 1 */
            {
              if (p->rtavl_rtag == RTAVL_THREAD)
                break;
            }
        }
    else
      {
        p = (struct rtavl_node *) &tree->rtavl_root;
        dir = 0;
      }

This code is included in 419.

    421. <Step 2: Insert RTAVL node 421> =
    n = tree->rtavl_alloc->libavl_malloc (tree->rtavl_alloc, sizeof *n);
    if (n == NULL)
      return NULL;

    tree->rtavl_count++;
    n->rtavl_data = item;
    n->rtavl_link[0] = NULL;
    if (dir == 0)
      n->rtavl_link[1] = p;
    else /* dir == 1 */
      {
        p->rtavl_rtag = RTAVL_CHILD;
        n->rtavl_link[1] = p->rtavl_link[1];
      }
    n->rtavl_rtag = RTAVL_THREAD;
    n->rtavl_balance = 0;
    p->rtavl_link[dir] = n;
    if (y == NULL)
      {
        n->rtavl_link[1] = NULL;
        return &n->rtavl_data;
      }

This code is included in 419.