BST Traverser Find Initialization - GNU libavl 2.0.2
Author: Ben Pfaff

4.9.3.4 Starting at a Found Node |

Sometimes it is convenient to begin a traversal at a particular item in a tree. This function works in the same was as bst_find(), but records parent pointers in the traverser structure as it descends the tree.

    67. <BST traverser search initializer 67> =
    void *
    bst_t_find (struct bst_traverser *trav, struct bst_table *tree, void *item)
    {
      struct bst_node *p, *q;

      assert (trav != NULL && tree != NULL && item != NULL);
      trav->bst_table = tree;
      trav->bst_height = 0;
      trav->bst_generation = tree->bst_generation;
      for (p = tree->bst_root; p != NULL; p = q)
        {
          int cmp = tree->bst_compare (item, p->bst_data, tree->bst_param);

          if (cmp < 0)
            q = p->bst_link[0];
          else if (cmp > 0)
            q = p->bst_link[1];
          else /* cmp == 0 */
            {
              trav->bst_node = p;
              return p->bst_data;
            }

          if (trav->bst_height >= BST_MAX_HEIGHT)
            {
              bst_balance (trav->bst_table);
              return bst_t_find (trav, tree, item);
            }
          trav->bst_stack[trav->bst_height++] = p;
        }

      trav->bst_height = 0;
      trav->bst_node = NULL;
      return NULL;
    }

This code is included in 63.