/* 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); }
// 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)); }
/** * 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
bool is_tnode_root(tnode *T) { return is_tnode(T, 0, ((int)CHAR_MAX)+1); }