Advertisement
elica123

Untitled

Nov 24th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.02 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define LAMBDA NULL
  4.  
  5. typedef char labeltype;
  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.  
  110. int search(char arr[], int strt, int end, char value);
  111.  
  112. node* newNode(char label);
  113.  
  114. node* buildTree(char in[], char pre[], int inStrt, int inEnd){
  115. static int preIndex =(sizeof(pre)/sizeof(pre[0]))-1; //zadnji u postorderu je korjen
  116.  
  117. if(inStrt > inEnd){
  118. return LAMBDA;
  119. }
  120. node *tNode; //krecem se od iza zbog defiicje postordera
  121. BiCreate(pre[preIndex--], NULL, NULL, *tNode);
  122.  
  123. if(inStrt == inEnd) //tu nam je bazicni slucaj
  124. return (*tNode);
  125. int inIndex = search(in, inStrt, inEnd, pre[preIndex--]);
  126. (*tNode)->rightchild = buildTree(in, pre, inIndex+1, inEnd);
  127. (*tNode)->leftchild= buildTree(in, pre, inStrt, inIndex-1);
  128. return (*tNode);
  129. }
  130.  
  131. int search(char arr[], int strt, int end, char value){ //pomocna funkcija za trazenje znaka
  132. int i;
  133. for(i = strt; i <= end; i++){
  134. if(arr[i] == value)
  135. return i;
  136. }
  137. }
  138.  
  139.  
  140. void print_tree(node* node, int l, BinaryTree T){
  141. int i;
  142. if(!node) return;
  143. printf ("%c", BiLabel(node, T));
  144. if (BiLeftChild(node, T)!=NULL) printf(" %c", BiLabel((BiLeftChild(node, T)), T));
  145. else printf (" NULL");
  146. if (BiRightChild(node, T)!=NULL) printf(" %c", BiLabel((BiRightChild(node, T)), T));
  147. else printf (" NULL");
  148. printf ("\n");
  149. printf("---------------\n");
  150. print_tree(BiLeftChild(node, T), l+1, T);
  151. print_tree(BiRightChild(node, T), l+1, T);
  152. }
  153.  
  154.  
  155. int main(){
  156. BinaryTree T;
  157. BiMakeNull(&T);
  158. char in[] = {'D', 'G', 'B', 'F', 'C', 'E', 'A'};
  159. char pre[] = {'G', 'D', 'F', 'E', 'C', 'A', 'B'};
  160. int len = sizeof(in)/sizeof(in[0]);
  161. node *root = buildTree(in, pre, 0, len - 1);
  162. print_tree(root, len, T);
  163. return 0;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement