Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #define max(a,b) (a>b)? a : b
- typedef struct tree{
- struct tree *left;
- struct tree *right;
- int value;
- char balance_factor;
- }tree;
- tree * right_rotation(tree* in)
- {
- tree*x=in->left;
- in->left=in->left->right;
- x->right=in;
- return x;
- }
- tree * left_rotation(tree* in)
- {
- tree*x=in->right;
- in->right=in->right->left;
- x->left=in;
- return x;
- }
- tree * rightleft_rotation (tree* in)
- {
- in->right=right_rotation(in->right);
- in=left_rotation(in);
- return in;
- }
- tree * leftright_rotation (tree* in)
- {
- in->left=left_rotation(in->left);
- in=right_rotation(in);
- return in;
- }
- tree * tree_balance(tree* in)
- {
- if (in->balance_factor==2&&in->left->balance_factor==1) {
- // printf("ty loh rl"); //когда вставили в левое поддерево левого поддерева
- in=right_rotation(in);
- return in;
- }
- if (in->balance_factor==2&&in->left->balance_factor==-1) {
- // printf("ty loh lr"); //когда вставили в правое поддерево левого поддерева
- in=leftright_rotation(in);
- return in;
- }
- if (in->balance_factor==-2&&in->right->balance_factor==-1) {
- // printf("ty loh r"); //когда вставили в правое поддерево правого поддерева
- in=left_rotation(in);
- return in;
- }
- if (in->balance_factor==-2&&in->right->balance_factor==1) {
- // printf("ty loh rl"); //когда вставили в левое поддерево правого поддерева
- in=rightleft_rotation(in);
- return in;
- }
- }
- tree *add_element(tree *in_tree,int addvalue)
- {
- tree* x;
- x=(tree*)malloc(sizeof(tree));
- x->value=addvalue;
- x->left=NULL;
- x->right=NULL;
- x->balance_factor=0;
- if (in_tree==NULL) {
- in_tree=x;
- }
- else {
- if (addvalue>in_tree->value)
- in_tree->right= add_element(in_tree->right,addvalue);
- else
- in_tree->left= add_element(in_tree->left,addvalue);
- }
- in_tree->balance_factor=tree_height(in_tree->left)-tree_height(in_tree->right);
- if (in_tree->balance_factor>1||in_tree->balance_factor<-1) in_tree=tree_balance(in_tree);
- //printf("%d\n",in_tree->balance_factor);
- return in_tree;
- }
- void obhod (tree* in)
- {
- if (in) {
- printf("%d ",in->value);
- obhod(in->left);
- obhod(in->right);
- }
- }
- int tree_height (tree* in)
- {
- return (!in) ? 0 : (max (tree_height(in->left),tree_height(in->right)))+1;
- }
- int main()
- {
- FILE *fin,*fout;
- fin=fopen("in.txt","r");
- tree *new_tree= NULL;
- int numbers,i,vertex;
- fscanf(fin,"%d",&numbers);
- for(i=0;i<numbers;i++) {
- fscanf(fin,"%d",&vertex);
- new_tree=add_element(new_tree,vertex);
- // printf("%d ",new_tree->value);
- }
- //obhod(new_tree);
- printf("%d",tree_height(new_tree));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement