//(c)Terminator
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>


typedef struct _bstree {
	int val;
	struct _bstree* left;
	struct _bstree* right;
} bstree;

static int  add(bstree** tr, int n);
static void clear(bstree* tr);
static void print(FILE* _o, const bstree* p, int n);


int main(void){
	int i;
	bstree* tr = NULL;
	
	for(i = 0; i < 20; ++i)
		add(&tr, rand() % 40);

	print(stdout, tr, 20);
	clear(tr);
	return 0;
}



//добавление элемента в дерево
static int add(bstree** tr, int n){
	bstree* p = *tr;
	while(p != NULL){
		if(n < p->val){
			tr = &p->left;
			p  = p->left;
		} else {
			if(n == p->val)
				return 0;
			tr = &p->right;
			p  = p->right;
		}
	}

	p = (bstree*)malloc(sizeof(bstree));
	if(p != NULL){
		p->left = p->right = NULL;
		p->val  = n;
		*tr = p;
	}
	return (p != NULL);
}


//удаление всего дерева
static void clear(bstree* tr){
	if(tr != NULL){
		if(tr->left != NULL)
			clear(tr->left);
		if(tr->right != NULL)
			clear(tr->right);
		free(tr);
	}
}


static void print(FILE* _o, const bstree* p, int n){
	int i;
	if(p != NULL){
		for(i = 0; i <= n; ++i)
			fputc(' ', _o);
		fprintf(_o, "%d\n", p->val);

		if(p->left != NULL)
			print(_o, p->left, n - 1);
		if(p->right != NULL)
			print(_o, p->right, n + 1);
	}
}
