Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.06 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define max(a,b) (a>b)? a : b
  4. typedef struct tree{
  5. struct tree *left;
  6. struct tree *right;
  7. int value;
  8. char balance_factor;
  9. }tree;
  10. tree * right_rotation(tree* in)
  11. {
  12. tree*x=in->left;
  13. in->left=in->left->right;
  14. x->right=in;
  15. return x;
  16.  
  17. }
  18. tree * left_rotation(tree* in)
  19. {
  20. tree*x=in->right;
  21. in->right=in->right->left;
  22. x->left=in;
  23. return x;
  24.  
  25. }
  26. tree * rightleft_rotation (tree* in)
  27. {
  28. in->right=right_rotation(in->right);
  29. in=left_rotation(in);
  30. return in;
  31. }
  32. tree * leftright_rotation (tree* in)
  33. {
  34. in->left=left_rotation(in->left);
  35. in=right_rotation(in);
  36. return in;
  37. }
  38. tree * tree_balance(tree* in)
  39. {
  40.  
  41. if (in->balance_factor==2&&in->left->balance_factor==1) {
  42. // printf("ty loh rl"); //когда вставили в левое поддерево левого поддерева
  43. in=right_rotation(in);
  44. return in;
  45. }
  46. if (in->balance_factor==2&&in->left->balance_factor==-1) {
  47. // printf("ty loh lr"); //когда вставили в правое поддерево левого поддерева
  48. in=leftright_rotation(in);
  49. return in;
  50. }
  51. if (in->balance_factor==-2&&in->right->balance_factor==-1) {
  52. // printf("ty loh r"); //когда вставили в правое поддерево правого поддерева
  53. in=left_rotation(in);
  54. return in;
  55. }
  56. if (in->balance_factor==-2&&in->right->balance_factor==1) {
  57. // printf("ty loh rl"); //когда вставили в левое поддерево правого поддерева
  58. in=rightleft_rotation(in);
  59. return in;
  60. }
  61. }
  62. tree *add_element(tree *in_tree,int addvalue)
  63. {
  64. tree* x;
  65. x=(tree*)malloc(sizeof(tree));
  66. x->value=addvalue;
  67. x->left=NULL;
  68. x->right=NULL;
  69. x->balance_factor=0;
  70. if (in_tree==NULL) {
  71. in_tree=x;
  72. }
  73. else {
  74. if (addvalue>in_tree->value)
  75. in_tree->right= add_element(in_tree->right,addvalue);
  76. else
  77. in_tree->left= add_element(in_tree->left,addvalue);
  78. }
  79. in_tree->balance_factor=tree_height(in_tree->left)-tree_height(in_tree->right);
  80. if (in_tree->balance_factor>1||in_tree->balance_factor<-1) in_tree=tree_balance(in_tree);
  81. //printf("%d\n",in_tree->balance_factor);
  82. return in_tree;
  83. }
  84. void obhod (tree* in)
  85. {
  86. if (in) {
  87. printf("%d ",in->value);
  88. obhod(in->left);
  89. obhod(in->right);
  90. }
  91. }
  92. int tree_height (tree* in)
  93. {
  94. return (!in) ? 0 : (max (tree_height(in->left),tree_height(in->right)))+1;
  95. }
  96. int main()
  97. {
  98. FILE *fin,*fout;
  99. fin=fopen("in.txt","r");
  100. tree *new_tree= NULL;
  101. int numbers,i,vertex;
  102. fscanf(fin,"%d",&numbers);
  103. for(i=0;i<numbers;i++) {
  104. fscanf(fin,"%d",&vertex);
  105. new_tree=add_element(new_tree,vertex);
  106. // printf("%d ",new_tree->value);
  107. }
  108. //obhod(new_tree);
  109. printf("%d",tree_height(new_tree));
  110. return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement