Example #1
0
/* bounds are used as in is_bst */
bool is_tnode(tnode *T, int lower, int upper) {
  if (T == NULL) return true;
  if (T->middle == NULL && !T->is_end) return false;
  return (lower < (int)T->c && (int)T->c < upper)
    && is_tnode(T->left, lower, T->c)
    && is_tnode_root(T->middle)
    && is_tnode(T->right, T->c, upper);
}
Example #2
0
// WHERE: 0 <= start && start < strlen(s);
// EFFECT: for each member m of tn that matches s[start,)
// add the concatenation of sb and m to q
// DETAILS: the sb should have the same string as before afetr
// the function returns
void tnode_lookup_generalized(tnode *tn, char *s, size_t start,
                              struct strbuf *sb, Queue q) {
  REQUIRES(is_tnode(tn));
  REQUIRES(s != NULL && 0 <= start && start < strlen(s));
  REQUIRES(is_strbuf(sb));
  REQUIRES(is_Queue(q));

  if (s[start] == '*') {
    if (tn == NULL) return;
    tnode_lookup_generalized(tn->left, s, start, sb, q);
    tnode_lookup_generalized(tn->right, s, start, sb, q);

    if (s[start + 1] == '\0' && tn->is_end) {
      strbuf_push(sb, s[start]);
      Queue_insert(q, strbuf_str(sb));
      strbuf_pop(sb);
      return;
    } else if (s[start + 1] == '\0') {
      tnode_lookup_generalized(tn->middle, s, start, sb, q);
    } else {
      ASSERT(s[start + 1] != '\n');
      strbuf_push(sb, s[start]);
      tnode_lookup_generalized(tn->middle, s, start, sb, q);
      tnode_lookup_generalized(tn->middle, s, start + 1, sb, q);
      strbuf_pop(sb);
    }
  } else {
    if (tn == NULL) return;
    if (s[i] < tn->c) {
      tnode_lookup_generalized(T->left, s, i, sb, q);
      return;
    } else if (s[i] > tn->c) {
      tnode_lookup_generalize(T->right, s, i, sb, q);
      return;
    } else if (s[i+1] == '\0') {
      strbuf_push(sb, s[i]);
      Queue_insert(q, sb);
      strbuf_pop(sb);
      return;
    }

    tnode_lookup(T->middle, s, i+1);
  }

  ENSURES(is_Queue(q));
}
Example #3
0
/**
 * Print a tree, indented by some number of spaces.
 * We assume that the indent has already been printed for the first
 * line.  (Yeah, that's strange, but it makes some thing easier.)
 */
static void
print_tree_indented (FILE *stream, Node *node, int spaces)
{
  if (node == NULL)
    {
      fprintf (stream, "*** ERROR: Null tree. ***\n");
    }
  else if (is_tnode (node))
    {
      print_tnode (stream, (TNode *) node);
    } // if it's a leaf node
  else if (is_nnode (node))
    {
      print_nnode (stream, (NNode *) node, spaces);
    } // if it's a compound node.
  else
    {
      fprintf (stream, "*** ERROR: Unknown node type %d. ***\n", node->type);
    }
} // print_tree_indented
Example #4
0
bool is_tnode_root(tnode *T) {
  return is_tnode(T, 0, ((int)CHAR_MAX)+1);
}