#include <stdio.h>

#define DEBUG
#include "heaptst1.h"

#define MAX_LINE 256

struct node {
	struct node * left;
	struct node * right;
	char * data;
};

struct node * insert(struct node *, struct node *);
struct node * build_node(char *);
char * getnext(void);
void walk_tree(struct node *);
void free_tree(struct node *);

void main()
{
	char * word;
	struct node *root, *new;

	root = NULL;
        free(root);                /* error */

	do {
		word = getnext();
                new = build_node(word);
		root = insert(new,root);
	} while (word != NULL);

        walk_tree(root);
        free_tree(root);
        exit(0);
}

struct node * insert(struct node * new, struct node * tree)
{
        if (tree==NULL) return new;
	if (new == NULL) return tree;
	if (strcmp(new->data,tree->data) < 0)
	   tree->left = insert(new,tree->left);
	else 
	   tree->right = insert(new,tree->right);
	return tree;
}
 	
struct node * build_node(char * word)
{
	struct node * new;

	if (word == NULL) return NULL;
	new = (struct node *) malloc( sizeof(struct node));
        new->right = new->left = NULL;
	new->data = word;
	return new;
}

char * getnext(void)
{
        char * new;
	char buffer[MAX_LINE];
	if ( gets(buffer) == NULL) return NULL;
	new = (char *) malloc( strlen(buffer)+1);
	strcpy(new,buffer);
	return new;
}

void walk_tree(struct node * tree)
{
        if (tree == NULL) return;
	if (tree->left != NULL) walk_tree(tree->left);
        if (tree->data != NULL) printf("%s\n",tree->data);
        if (tree->right != NULL) walk_tree(tree->right);
}

void free_tree(struct node * tree)
{ 
	if (tree == NULL) return;
	if (tree->left != NULL) 
              free_tree(tree->left);
	if (tree->right != NULL) 
              free_tree(tree->right);
	if (tree->data != NULL) 
	      free(tree->data);
	free(tree);
        free(tree);                 /* error */
}
