Advertisement
elica123

Untitled

Nov 26th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define LAMBDA NULL
  4.  
  5. typedef char labeltype; //oznaka cvora
  6.  
  7. typedef struct celltype{
  8. labeltype label;
  9. struct celltype *leftchild;
  10. struct celltype *rightchild;
  11. }celltype;
  12.  
  13. typedef celltype *node;
  14. typedef celltype *BinaryTree;
  15.  
  16. void BiCreate(labeltype l, BinaryTree TL, BinaryTree TR, BinaryTree *Tp){
  17. *Tp=(celltype*)malloc(sizeof(celltype));
  18. (*Tp)->label=l;
  19. (*Tp)->leftchild=TL;
  20. (*Tp)->rightchild=TR;
  21. }
  22.  
  23. void BiMakeNull(BinaryTree *Tp){
  24. *Tp=NULL;
  25. }
  26.  
  27. int BiEmpty(BinaryTree T){
  28. if(T==NULL) return 1;
  29. return 0;
  30. }
  31.  
  32. void BiLeftSubtree(BinaryTree T, BinaryTree *TLp){
  33. if(BiEmpty(T))exit(8); //nije definirano
  34. (*TLp)=T->leftchild;
  35. }
  36.  
  37. void BiRightSubtree(BinaryTree T, BinaryTree *TRp){
  38. if(BiEmpty(T))exit(8);
  39. (*TRp)=T->rightchild;
  40. }
  41.  
  42. node BiInsertLeftChild(labeltype l, node i, BinaryTree *Tp){
  43. if(i==NULL) exit(8); //nije definirana
  44. if(i->leftchild!=NULL) return LAMBDA;
  45. BiCreate(l, NULL, NULL, (&i->leftchild));
  46. return i->leftchild;
  47. }
  48.  
  49. node BiInsertRightChild(labeltype l, node i, BinaryTree *Tp){
  50. if(i==NULL) exit(8); // nije definirana
  51. if(i->rightchild!=NULL) return LAMBDA;
  52. BiCreate(l, NULL, NULL, (&i->rightchild));
  53. return i->rightchild;
  54. }
  55.  
  56. void BiDelete(node i, BinaryTree *Tp){
  57. if(i==NULL) exit(1);
  58. if(i->leftchild!=NULL || i->rightchild!=NULL) exit(1);
  59. i=NULL;
  60. }
  61.  
  62. node BiRoot(BinaryTree T){
  63. if(T==NULL)
  64. return LAMBDA;
  65. return T;
  66. }
  67.  
  68. node BiLeftChild(node i, BinaryTree T){
  69. if(i->leftchild==NULL)
  70. return LAMBDA;
  71. return i->leftchild;
  72. }
  73.  
  74. node BiRightChild(node i, BinaryTree T){
  75. if(i->rightchild==NULL)
  76. return LAMBDA;
  77. return i->rightchild;
  78. }
  79.  
  80. void roditelj(node *otac, node i, node kor, BinaryTree T) { //pomocna funkcija
  81. if (BiLeftChild(i, T)== i || BiRightChild(i, T)== i)
  82. *otac = kor;
  83. if (*otac)
  84. return;
  85. if (BiLeftChild(i, T))
  86. roditelj(otac, i, BiLeftChild(i, T),T);
  87. if (BiRightChild(i, T))
  88. roditelj(otac, i, BiRightChild(i, T),T);
  89. }
  90.  
  91. node BiParent(node i, BinaryTree T){
  92. if(i==NULL) exit(8); //nije definirana
  93. if(i==T) return LAMBDA;
  94. node otac=NULL;
  95. roditelj(&otac, i, T, T);
  96. return otac;
  97. }
  98.  
  99. labeltype BiLabel(node i, BinaryTree T){
  100. if(i==NULL) exit(8); //nije definirana
  101. return i->label;
  102. }
  103.  
  104. void BiChangeLabel(labeltype l, node i, BinaryTree *Tp){
  105. if(i==NULL) exit(8); //nije definirana
  106. i->label=l;
  107. }
  108.  
  109. int search(char arr[], int strt, int end, char value);
  110.  
  111. int preIndex;
  112. BinaryTree buildTree(char in[], char pre[], int inStrt, int inEnd){
  113. //zadnji u postorderu je korjen
  114.  
  115. if(inStrt > inEnd){
  116. return LAMBDA;
  117. }
  118.  
  119. BinaryTree tNode; //krecem se od iza zbog defiicje postordera
  120. BiMakeNull(&tNode);
  121. if(inStrt == inEnd) {
  122. BiCreate(pre[--preIndex], LAMBDA, LAMBDA, &tNode);
  123. return tNode;
  124. }
  125.  
  126. BinaryTree A, B;
  127. BiMakeNull(&A);
  128. BiMakeNull(&B);
  129.  
  130. int inIndex = search(in, inStrt, inEnd, pre[--preIndex]);
  131. char moj_label = pre[preIndex];
  132. B = buildTree(in, pre, inIndex+1, inEnd);
  133. A = buildTree(in, pre, inStrt, inIndex-1);
  134. BiCreate(moj_label, A, B, &tNode);
  135. return tNode;
  136. }
  137.  
  138. int search(char arr[], int strt, int end, char value){ //pomocna funkcija za trazenje znaka
  139. int i;
  140. for(i = strt; i <= end; i++){
  141. if(arr[i] == value)
  142. return i;
  143. }
  144. }
  145.  
  146.  
  147. void print_tree(node cvor, BinaryTree T){
  148. int i;
  149. if(!cvor) return;
  150. printf ("%c", BiLabel(cvor, T));
  151. if (BiLeftChild(cvor, T)!=NULL) printf(" %c", BiLabel((BiLeftChild(cvor, T)), T));
  152. else printf (" NULL");
  153. if (BiRightChild(cvor, T)!=NULL) printf(" %c", BiLabel((BiRightChild(cvor, T)), T));
  154. else printf (" NULL");
  155. printf ("\n");
  156. print_tree(BiLeftChild(cvor, T), T);
  157. print_tree(BiRightChild(cvor, T), T);
  158. }
  159.  
  160. int funkcija(char* s){
  161. int i=0;
  162. while(s[i]!='\0')i++;
  163. return i;
  164. }
  165.  
  166. int main(){
  167. BinaryTree T;
  168. BiMakeNull(&T);
  169. char in[1000];
  170. char pre[1000];
  171. scanf("%s", in);
  172. scanf("%s", pre);
  173. /*char in[] = {'d', 'b', 'h', 'e', 'i', 'a', 'f', 'c', 'g'};
  174. char pre[] = {'d', 'h', 'i', 'e', 'b', 'f', 'g', 'c', 'a'}; */
  175. int len = funkcija(in);
  176. printf("%d len\n",len);
  177. preIndex = len;
  178. T = buildTree(in, pre, 0, len - 1);
  179. print_tree(BiRoot(T), T);
  180. return 0;
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement