// aux display and verification routines, helpful but not essential struct trunk { struct trunk *prev; const char *str; }; static void show_trunks(struct trunk *p) { if ( !p ) return; show_trunks(p->prev); printf("%s", p->str); } // this is very haphazzard static void show_tree(struct tree_node *root, struct trunk *prev, int is_left) { if ( root == NULL ) return; struct trunk this_disp = { prev, " " }; const char *prev_str = this_disp.str; show_tree(root->right, &this_disp, 1); if ( !prev ) this_disp.str = "---"; else if ( is_left ) { this_disp.str = ".--"; prev_str = " |"; } else { this_disp.str = "`--"; prev->str = prev_str; } show_trunks(&this_disp); if ( root->key >= 'A' && root->key <= 'Z' ) printf("%c\n", root->key); else printf("%d\n", root->key); if ( prev ) prev->str = prev_str; this_disp.str = " |"; show_tree(root->left, &this_disp, 0); if ( !prev ) puts(""); }