// scanning text and counting word frequencies
// note - can use stripWords to clean up words before sending to this program
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#include "/u1/h0/jkinne/public_html/cs202-f2019/code/data_structures/binary_tree/bst.h"
/* Begin word_counts_t type declaration and functions for using */
int compare_int(void *data1, int data1_size, void *data2, int data2_size) {
  int *d1 = (int *) data1,
    *d2 = (int *) data2;
  return (*d1 - *d2);
}
void print_int(void *data, int data_size, int depth) {
  int *num = (int *) data;
  printf("%*s%d\n", depth, "", *num);
}
void free_int(void *data, int data_size) {
  ;
}
/* End word_counts_t type declaration and functions for using */
int main(int argc, char * argv[]) {
  tree_t * root = NULL;
  tree_t * p;
  int num;
  
  while (scanf("%d", &num) == 1) {
    int delete = 0;
    
    if (num < 0) { // negative is a code for deleting
      num *= -1;
      delete = 1;
    }
    p = bst_lookup(root, &num, sizeof(num));
    if (p == NULL && ! delete) {
      root = bst_insert(root,
			&num, sizeof(num), FLAG_DO_NOT_REBALANCE, 
			compare_int, print_int, free_int);
    }
    if (p != NULL && delete) {
      root = bst_delete(root, p, 0);
    }
  }
  bst_print(root, -1, FLAG_TREE | FLAG_SUMMARY | FLAG_SMALLEST_FIRST);
  return 0;
}