ovictoraurelio

Untitled

Sep 7th, 2016
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.46 KB | None | 0 0
  1. /***
  2.     *
  3.     * @author cin.ufpe.br/~vags
  4.     * @since 01/09/16
  5.     *
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9.  
  10. typedef struct tree{
  11.     int id, height, balance;
  12.     struct tree *left, *right;
  13. }Tree;
  14.  
  15. void addNode(Tree **node, Tree *new);
  16. void rotateRight(Tree **node); 
  17. void rotateLeft(Tree **node);
  18. void rebalanceTree(Tree **node);
  19. int isBalancedTree(Tree *node);
  20. int getTreeBalance(Tree *node);
  21. int getHeight(Tree *node);
  22. int maxValue(int a, int b);
  23. void showTree(Tree *node);
  24. int recalcAllHeights(Tree **node);
  25. Tree *root = NULL, **unbalanced = NULL;
  26.  
  27. int main(int argc, char const *argv[]){
  28.     int n;
  29.     printf("----");
  30.     while(scanf(" %d", &n) == 1){
  31.             printf("\nAdicionando %d", n);
  32.             Tree *new = malloc(sizeof(Tree));
  33.             new->id = n;
  34.             addNode(&root, new);
  35.             recalcAllHeights(&root);           
  36.             if(unbalanced == NULL){
  37.                 printf("\nContinuou AVL...\n  ");
  38.                 showTree(root);
  39.             }else{
  40.                 printf("\nAntes de ajustar balanceamento...\n  ");
  41.                 showTree(root);            
  42.                 rebalanceTree(unbalanced);
  43.                 printf("\nDepois de ajustar balanceamento...\n  ");
  44.                 showTree(root);
  45.             }
  46.             recalcAllHeights(&root);
  47.             printf("\n----");
  48.     }
  49.     return 0;
  50. }
  51. int maxValue(int a, int b){
  52.     return a > b ? a : b;
  53. }
  54. int getHeight(Tree *node){
  55.     return node == NULL ? 0 : node->height;        
  56. }
  57. int getTreeBalance(Tree *node){
  58.     if(node == NULL){
  59.         return 0;
  60.     }else{
  61.         return node->balance = getHeight(node->right) - getHeight(node->left);
  62.     }
  63. }
  64. int recalcAllHeights(Tree **node){
  65.     if(*node == NULL){
  66.         return 0;
  67.     }else{     
  68.         (*node)->height = 1 + maxValue(recalcAllHeights(&(*node)->left), recalcAllHeights(&(*node)->right));
  69.         (*node)->balance = getTreeBalance((*node));
  70.         if(unbalanced == NULL && ((*node)->balance < -1 || 1 < (*node)->balance))
  71.             unbalanced = node;     
  72.         return (*node)->height;
  73.     }
  74. }
  75. void addNode(Tree **node, Tree *new){
  76.     if((*node) == NULL){
  77.         (*node) = new;     
  78.         new->left = new->right = NULL;       
  79.     }else if(new->id >= (*node)->id){
  80.         //adding to right      
  81.         addNode(&((*node)->right), new);
  82.     }else{
  83.         //adding to left       
  84.         addNode(&((*node)->left), new);    
  85.     }
  86. }
  87. void rebalanceTree(Tree **node){   
  88.     if(getTreeBalance(*node) > 1){
  89.         rotateLeft(node);      
  90.     }else if(getTreeBalance(*node) < -1){                              
  91.         rotateRight(node);
  92.     }  
  93. }
  94. void showTree(Tree *node){
  95.     if(node != NULL){
  96.         printf(" ( %d ", node->id);    
  97.         showTree(node->left);
  98.         showTree(node->right);
  99.         printf(") ");
  100.     }else{
  101.         printf(" () ");
  102.     }  
  103. }
  104. void rotateRight(Tree **node){     
  105.     if(getTreeBalance((*node)->left) >= 1){//Duo rotation      
  106.         Tree *leftOfRoot = (*node)->left;
  107.         Tree *newRoot = (*node)->left->right;
  108.         leftOfRoot->right = (*node)->left->right->left;
  109.         (*node)->left = newRoot->right;
  110.         newRoot->left = leftOfRoot;
  111.         newRoot->right = (*node);
  112.         (*node) = newRoot;
  113.     }else{//Simple rotation                        
  114.         Tree *newRoot = (*node)->left;
  115.         (*node)->left = (*node)->left->right;
  116.         newRoot->right = (*node);
  117.         (*node) = newRoot;
  118.     }  
  119.     unbalanced = NULL;
  120. }
  121. void rotateLeft(Tree **node){  
  122.     if(getTreeBalance((*node)->right) <= -1){//Duo Rotation        
  123.         Tree *rightOfRoot = (*node)->right;
  124.         Tree *newRoot = (*node)->right->left;
  125.         rightOfRoot->left = (*node)->right->left->left;
  126.         (*node)->right = newRoot->right;
  127.         newRoot->right = rightOfRoot;
  128.         newRoot->left = (*node);
  129.         (*node) = newRoot;
  130.     }else{//Simple rotation            
  131.         Tree *newRoot = (*node)->right;    
  132.         (*node)->right = (*node)->right->left;     
  133.         newRoot->left = (*node);
  134.         (*node) = newRoot;     
  135.     }  
  136.     unbalanced = NULL;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment