Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- struct Node
- {
- int key;
- struct Node *left;
- struct Node *right;
- int height;
- };
- struct Queue
- {
- int dato;
- int estado;
- struct Queue * next;
- };
- int max(int a, int b);
- int height(struct Node *N)
- {
- if (N == NULL)
- return 0;
- return N->height;
- }
- int max(int a, int b)
- {
- return (a > b)? a : b;
- }
- struct Node* newNode(int key)
- {
- struct Node* node = (struct Node*)
- malloc(sizeof(struct Node));
- node->key = key;
- node->left = NULL;
- node->right = NULL;
- node->height = 1; // new node is initially added at leaf
- return(node);
- }
- // A utility function to right rotate subtree rooted with y
- struct Node *rightRotate(struct Node *y)
- {
- struct Node *x = y->left;
- struct Node *T2 = x->right;
- // Perform rotation
- x->right = y;
- y->left = T2;
- // Update heights
- y->height = max(height(y->left), height(y->right))+1;
- x->height = max(height(x->left), height(x->right))+1;
- // Return new root
- return x;
- }
- // A utility function to left rotate subtree rooted with x
- struct Node *leftRotate(struct Node *x)
- {
- struct Node *y = x->right;
- struct Node *T2 = y->left;
- // Perform rotation
- y->left = x;
- x->right = T2;
- // Update heights
- x->height = max(height(x->left), height(x->right))+1;
- y->height = max(height(y->left), height(y->right))+1;
- // Return new root
- return y;
- }
- int getBalance(struct Node *N)
- {
- if (N == NULL)
- return 0;
- return height(N->left) - height(N->right);
- }
- // Recursive function to insert a key in the subtree rooted
- // with node and returns the new root of the subtree.
- struct Node* insert(struct Node* node, int key)
- {
- /* 1. Perform the normal BST insertion */
- if (node == NULL)
- return(newNode(key));
- if (key < node->key)
- node->left = insert(node->left, key);
- else if (key > node->key)
- node->right = insert(node->right, key);
- else // Equal keys are not allowed in BST
- return node;
- /* 2. Update height of this ancestor node */
- node->height = 1 + max(height(node->left),
- height(node->right));
- /* 3. Get the balance factor of this ancestor
- node to check whether this node became
- unbalanced */
- int balance = getBalance(node);
- // If this node becomes unbalanced, then
- // there are 4 cases
- // Left Left Case
- if (balance > 1 && key < node->left->key)
- return rightRotate(node);
- // Right Right Case
- if (balance < -1 && key > node->right->key)
- return leftRotate(node);
- // Left Right Case
- if (balance > 1 && key > node->left->key)
- {
- node->left = leftRotate(node->left);
- return rightRotate(node);
- }
- // Right Left Case
- if (balance < -1 && key < node->right->key)
- {
- node->right = rightRotate(node->right);
- return leftRotate(node);
- }
- /* return the (unchanged) node pointer */
- return node;
- }
- struct Node * minValueNode(struct Node* node)
- {
- struct Node* current = node;
- /* loop down to find the leftmost leaf */
- while (current->left != NULL)
- current = current->left;
- return current;
- }
- struct Node* deleteNode(struct Node* root, int key)
- {
- if (root == NULL)
- return root;
- // If the key to be deleted is smaller than the
- // root's key, then it lies in left subtree
- if ( key < root->key )
- root->left = deleteNode(root->left, key);
- // If the key to be deleted is greater than the
- // root's key, then it lies in right subtree
- else if( key > root->key )
- root->right = deleteNode(root->right, key);
- // if key is same as root's key, then This is
- // the node to be deleted
- else
- {
- // node with only one child or no child
- if( (root->left == NULL) || (root->right == NULL) )
- {
- struct Node *temp = root->left ? root->left :
- root->right;
- // No child case
- if (temp == NULL)
- {
- temp = root;
- root = NULL;
- }
- else // One child case
- *root = *temp; // Copy the contents of
- // the non-empty child
- free(temp);
- }
- else
- {
- // node with two children: Get the inorder
- // successor (smallest in the right subtree)
- struct Node* temp = minValueNode(root->right);
- // Copy the inorder successor's data to this node
- root->key = temp->key;
- // Delete the inorder successor
- root->right = deleteNode(root->right, temp->key);
- }
- }
- // If the tree had only one node then return
- if (root == NULL)
- return root;
- root->height = 1 + max(height(root->left),
- height(root->right));
- // GET THE BALANCE FACTOR OF THIS NODE (to
- // check whether this node became unbalanced)
- int balance = getBalance(root);
- // If this node becomes unbalanced, then there are 4 cases
- // Left Left Case
- if (balance > 1 && getBalance(root->left) >= 0)
- return rightRotate(root);
- // Left Right Case
- if (balance > 1 && getBalance(root->left) < 0)
- {
- root->left = leftRotate(root->left);
- return rightRotate(root);
- }
- // Right Right Case
- if (balance < -1 && getBalance(root->right) <= 0)
- return leftRotate(root);
- // Right Left Case
- if (balance < -1 && getBalance(root->right) > 0)
- {
- root->right = rightRotate(root->right);
- return leftRotate(root);
- }
- return root;
- }
- void preOrder(struct Node *root)
- {
- if(root != NULL)
- {
- printf("%d, ", root->key);
- preOrder(root->left);
- preOrder(root->right);
- }
- }
- int nodos_por_nivel(struct Node *root,int * arr)//Pone en el arreglo la cantidad de nodos por nivel en un barrido preorder
- {
- if(root != NULL)
- {
- *(arr+root->height-1)+=1;
- nodos_por_nivel(root->left,arr);
- nodos_por_nivel(root->right,arr);
- }
- }
- void postOrder(struct Node *root)
- {
- if(root!=NULL)
- {
- postOrder(root->left);
- postOrder(root->right);
- printf("%d, ",root->key);
- }
- }
- void simetrico (struct Node *root)
- {
- if(root!=NULL)
- {
- simetrico(root->left);
- printf("%d, ",root->key);
- simetrico(root->right);
- }
- }
- void por_nivel (struct Node * root)
- {
- int n,h;
- h=calcular_altura(root);
- for(n=0; n<h; n++)
- mostrar_nivel(root,n);
- }
- void mostrar_nivel (struct Node * root, int n)
- {
- if(root==NULL)
- return;
- else if (n==0)
- {
- printf("%d, ",root->key);
- return;
- }
- else
- {
- mostrar_nivel(root->left,n-1);
- mostrar_nivel(root->right,n-1);
- }
- }
- int calcular_altura (struct Node * root)
- {
- int der, izq;
- if(root==NULL)
- return 0;
- else
- {
- izq=calcular_altura(root->left);
- der=calcular_altura(root->right);
- if(izq>der)
- return izq+1;
- else
- return der+1;
- }
- }
- int main()
- {
- struct Node *root = NULL;
- int aux,i, res=0;
- int * arreglo_aux =NULL;
- FILE * arch = fopen("avl_4.5M.txt","r");
- fscanf(arch, "%d\n",&aux);
- while(!feof(arch)){
- root = insert(root,aux);
- fscanf(arch, "%d\n",&aux);
- }
- printf("Altura izq: %d, altura der: %d\n",calcular_altura(root->left),calcular_altura(root->right));
- aux=root->height;
- arreglo_aux=malloc(aux*sizeof(int));
- for(i=0;i<aux;i++){
- *(arreglo_aux+i)=0;
- }
- nodos_por_nivel(root,arreglo_aux);
- for(i=1;i<aux+1;i++)
- printf("En el nivel %d hay %d nodos\n",i,arreglo_aux[aux-i]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement