#include <iostream>
#include <stdlib.h>
#include <ctime>
#include <cstdlib>
#include <stdio.h>
using namespace std;
#define SIZE 70000
typedef struct node{
int data;
node *left;
node *right;
node *parent;
} node;
struct node * CreateTree(void){
struct node *root;
root = (struct node *)malloc(sizeof(struct node));
root->data = NULL;
root->parent = NULL;
root->left = NULL;
root->right = NULL;
return root;
}
struct node * CreateNode(int data){
struct node *p = (struct node *)malloc(sizeof(struct node));
p->data = data;
p->left = NULL;
p->right = NULL;
p->parent = NULL;
return p;
}
void TreeDestroy(struct node *root){
if(root){
TreeDestroy(root->left);
TreeDestroy(root->right);
free(root);
}
}
void TreeInsert(struct node *root, struct node *z){
struct node *y = NULL;
struct node *x = root;
while(x != NULL){
y = x;
if(z->data < x->data)
x = x->left;
else
x = x->right;
}
z->parent = y;
if(y == NULL)
root = z;
else{
if(z->data < y->data)
y->left = z;
else
y->right = z;
}
}
void genOrderedSeq(int *array){
for(int i = 0; i < SIZE; i++)
array[i] = i;
}
void genRandSeq(int *array){
std::srand(std::time(0));
for(int i = 0; i < SIZE; i++)
array[i] = std::rand();
}
//Генерация инвертированной последовательности (по убыванию)
void genInvertedSeq(int *array){
for(int i = SIZE; i > 0; i--)
array[SIZE-i] = i;
}
/*Высота дерева*/
int height(struct node *p){
struct node *temp = p;
int h1 = 0,h2 = 0;
if(p == NULL) return 0;
if(p->left){h1=height(p->left);}
if(p->right){h2=height(p->right);}
return(std::max(h1,h2)+1);
}
int main(){
int seq[SIZE];
struct node *tree;
struct node *tmp;
/*Случайная последовательность*/
genRandSeq(seq);
std::cout << "*** Random Sequence ***" << std::endl;
tree = CreateTree();
for(int i = 0; i < SIZE; i++){
tmp = CreateNode(seq[i]);
TreeInsert(tree, tmp);
}
TreeDestroy(tree);
/*Упорядоченная последовательность*/
genOrderedSeq(seq);
std::cout << "*** Ordered Sequence ***" << std::endl;
tree = CreateTree();
for(int i = 0; i < SIZE; i++){
tmp = CreateNode(seq[i]);
TreeInsert(tree, tmp);
}
printf("tree height: %d", height(tree));
TreeDestroy(tree);
/*Инвертированная последовательность*/
genInvertedSeq(seq);
std::cout << "*** Inverted Sequence ***" << std::endl;
tree = CreateTree();
for(int i = 0; i < SIZE; i++){
tmp = CreateNode(seq[i]);
TreeInsert(tree, tmp);
}
printf("tree height: %d", height(tree));
TreeDestroy(tree);
}