if (p->rtbst_link[0] == NULL)
  {
    if (p->rtbst_rtag == RTBST_CHILD)
      {
        q->rtbst_link[dir] = p->rtbst_link[1];
      }
    else
      {
        q->rtbst_link[dir] = p->rtbst_link[dir];
        if (dir == 1)
          q->rtbst_rtag = RTBST_THREAD;
      }
  }
else
  {
    struct rtbst_node *r = p->rtbst_link[0];
    if (r->rtbst_rtag == RTBST_THREAD)
      {
        r->rtbst_link[1] = p->rtbst_link[1];
        r->rtbst_rtag = p->rtbst_rtag;
        q->rtbst_link[dir] = r;
      }
    else
      {
        struct rtbst_node *s;

        for (;;)
          {
            s = r->rtbst_link[1];
            if (s->rtbst_rtag == RTBST_THREAD)
              break;

            r = s;
          }

        if (s->rtbst_link[0] != NULL)
          r->rtbst_link[1] = s->rtbst_link[0];
        else
          {
            r->rtbst_link[1] = s;
            r->rtbst_rtag = RTBST_THREAD;
          }

        s->rtbst_link[0] = p->rtbst_link[0];
        s->rtbst_link[1] = p->rtbst_link[1];
        s->rtbst_rtag = p->rtbst_rtag;

        q->rtbst_link[dir] = s;
      }
  }

