Advertisement
elica123

Untitled

Nov 24th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.38 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define LAMBDA NULL
  6.  
  7. typedef char *labeltype;
  8.  
  9. typedef struct celltag {
  10. labeltype label; //oznaka cvora
  11. struct celltag *leftchild; // pointer na lijevo dijete
  12. struct celltag *rightchild; // pointer na desno dijete
  13. } celltype;
  14.  
  15. typedef struct node{
  16. char data;
  17. struct node* left;
  18. struct node* right;
  19. };
  20.  
  21. typedef celltype *node;
  22.  
  23. typedef celltype *BinaryTree;
  24.  
  25. void BiMakeNull(BinaryTree *T){ //radi prazno stablo, stavlja pointer na stablo na NULL
  26. *T=NULL;
  27. }
  28.  
  29. int BiEmpty (BinaryTree T){ //provjerava je li stablo prazno
  30. if (T) return 0;
  31. else return 1;
  32. }
  33.  
  34. void BiCreate (labeltype l, BinaryTree TL, BinaryTree TR, BinaryTree *T) { //kreira novo stablo
  35. *T = (celltype*)malloc(sizeof(celltype)); //alokacija memorije za korijen
  36. (*T)->label = l; //oznaka korijena
  37. (*T)->leftchild = TL; //stvaranje lijevog podstabla
  38. (*T)->rightchild = TR; //stvaranje desnog podstabla
  39. }
  40.  
  41. void BiLeftSubtree (BinaryTree T, BinaryTree *TL){ //vraca lijevo podstablo
  42. *TL=T->leftchild;
  43. }
  44.  
  45. void BiRightSubtree (BinaryTree T, BinaryTree *TR){ //vraca deno podstablo
  46. *TR=T->rightchild;
  47. }
  48.  
  49. node BiInsertLeftChild(labeltype l, node i, BinaryTree *T){ //umetanje lijevog djeteta
  50. if (!i){
  51. printf("Takav cvor ne postoji.");
  52. exit(2); //exit(2)->ne postoji cvor kome bi umetnuli lijevo dijete
  53. }
  54.  
  55. if (i->leftchild != NULL){
  56. printf("Takav cvor vec ima lijevo dijete."); //exit(4)-> cvor vec ima lijevo dijete
  57. exit(4);
  58. }
  59.  
  60. if (!(i->leftchild = (celltype*)malloc(sizeof(celltype)))){ //provjera ima li memorije za cvor
  61. printf("Mem out.");
  62. exit(8); //exit(8)->Nemam memorije za novi cvor
  63. }
  64.  
  65. i->leftchild->label = l; //oznaka cvora je l
  66. i->leftchild->leftchild = i->leftchild->rightchild = NULL; //pointeri na lijevo i desno dijete novog cvora su NULL
  67.  
  68. return i->leftchild; //funkcija vraca pointer na novi cvor
  69. }
  70.  
  71. node BiInsertRightChild(labeltype l, node i, BinaryTree *T){ //umetanje desnog djeteta
  72. if (!i){
  73. printf("Takav cvor ne postoji.");
  74. exit(2); //exit(2)->ne postoji cvor kome bi umetnuli desno dijete
  75. }
  76.  
  77. if (i->rightchild != NULL){
  78. printf("Takav cvor vec ima desno dijete.");
  79. exit(4); //exit(4)-> cvor vec ima desno dijete
  80. }
  81.  
  82. if (!(i->rightchild = (celltype*)malloc(sizeof(celltype)))){
  83. printf("Mem out.");
  84. exit(8); //exit(8)->Nemam memorije za novi cvor
  85. }
  86.  
  87. i->rightchild->label = l; //oznaka cvora je l
  88. i->rightchild->leftchild = i->rightchild->rightchild = NULL; //pointeri na lijevo i desno dijete novog cvora su NULL
  89.  
  90. return i->rightchild; //funkcija vraca pointer na novi cvor
  91. }
  92.  
  93.  
  94. node BiRoot(BinaryTree T){ //vraca korijen binarnog stabla
  95. return T;
  96. }
  97.  
  98. node BiLeftChild( node i, BinaryTree T){ //vraca lijevo dijete cvora
  99. if (!i) return LAMBDA;
  100. if (i->leftchild == NULL) return LAMBDA;
  101.  
  102. return i->leftchild;
  103. }
  104.  
  105. node BiRightChild(node i, BinaryTree T){ //vraca desno dijete cvora
  106. if (i==NULL) return LAMBDA;
  107. if (i->rightchild == NULL) return LAMBDA;
  108.  
  109. return i->rightchild;
  110. }
  111.  
  112. void ParentSearch(node *parent, node i, node root){ //pomocna funkcija, trazi roditelja od cvora
  113. if ((root->leftchild == i) || (root->rightchild == i))
  114. *parent = root;
  115.  
  116. if (*parent) return;
  117.  
  118. if (root->leftchild) ParentSearch(parent, i, root->leftchild);
  119. if (root->rightchild) ParentSearch(parent, i, root->rightchild);
  120. }
  121.  
  122. node BiParent(node i, BinaryTree T){ // vraca roditelja od cvora
  123. if (!i){
  124. printf("Taj cvor ne postoji.");
  125. exit(1);
  126. }
  127.  
  128. if (i == T) return NULL;
  129. node roditelj = NULL;
  130. ParentSearch(&roditelj, i, T);
  131. return roditelj;
  132. }
  133.  
  134. void BiDelete(node i, BinaryTree *T){ // brise cvor
  135. if (!i){
  136. printf("Takav cvor ne postoji.");
  137. exit(2);
  138. }
  139.  
  140. if (i->rightchild || i->leftchild){
  141. printf("Taj cvor ima dijete pa se ne moze izbrisati!");
  142. exit(16);
  143. }
  144. node r=BiParent(i, *T);
  145. if (r==LAMBDA){
  146. free (T);
  147. return;
  148. }
  149. if ( BiLeftChild(r,*T)==i ) r->leftchild=NULL;
  150. else r->rightchild==NULL;
  151. free(i);
  152. }
  153.  
  154.  
  155. labeltype BiLabel(node i, BinaryTree T){ //vraca oznaku cvora
  156. if (i==NULL){
  157. printf ("Takav cvor ne postoji");
  158. exit(2);
  159. }
  160.  
  161. return i->label;
  162. }
  163.  
  164. void BiChangeLabel(labeltype l,node i, BinaryTree *T){ // mijenja oznaku cvora
  165. if (i==NULL){
  166. printf("Takav cvor ne postoji");
  167. exit(2);
  168. }
  169. i->label = l;
  170. }
  171. /*gotova implementacija binarnog stabla*/
  172.  
  173.  
  174.  
  175.  
  176. int search(char arr[], int strt, int end, char value);
  177.  
  178. struct node* newNode(char data);
  179.  
  180. struct node* buildTree(char in[], char pre[], int inStrt, int inEnd)
  181. {
  182. static int preIndex =(sizeof(pre)/sizeof(pre[0]))-1; //zadnji u postorderu je korjen
  183.  
  184. if(inStrt > inEnd)
  185. {
  186. return NULL;}
  187.  
  188. struct node *tNode = newNode(pre[preIndex--]); //krecem se od iza zbog defiicje postordera
  189.  
  190.  
  191. if(inStrt == inEnd) //tu nam je bazicni slucaj
  192. return tNode;
  193.  
  194. int inIndex = search(in, inStrt, inEnd, tNode->data);
  195.  
  196. tNode->left= buildTree(in, pre, inStrt, inIndex-1);
  197. tNode->right = buildTree(in, pre, inIndex+1, inEnd);
  198.  
  199. return tNode;
  200. }
  201.  
  202. int search(char arr[], int strt, int end, char value){
  203. int i;
  204. for(i = strt; i <= end; i++)
  205. {
  206. if(arr[i] == value)
  207. return i;
  208. }
  209. }
  210.  
  211.  
  212. struct node* newNode(char data){
  213. struct node* node = (struct node*)malloc(sizeof(struct node));
  214. node->data = data;
  215. node->left = NULL;
  216. node->right = NULL;
  217. return(node);
  218. }
  219.  
  220.  
  221. void print_tree(struct node* node, int l)
  222. {
  223. int i;
  224.  
  225. if(!node) return;
  226. printf ("%c", node->data);
  227. if (node->left!=NULL) printf(" %c", node->left->data);
  228. else printf (" NULL");
  229. if (node->right!=NULL) printf(" %c", node->right->data);
  230. else printf (" NULL");
  231. printf ("\n");
  232. print_tree(node->left, l+1);
  233. print_tree(node->right, l+1);}
  234.  
  235.  
  236.  
  237. int main(){
  238. BinaryTree T;
  239. BiMakeNull(&T);
  240. char in[] = {'D', 'G', 'B', 'F', 'C', 'E', 'A'};
  241. char pre[] = {'G', 'D', 'F', 'E', 'C', 'A', 'B'};
  242. int len = sizeof(in)/sizeof(in[0]);
  243. struct node *root = buildTree(in, pre, 0, len - 1);
  244. print_tree(root, len);
  245. return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement