Advertisement
Guest User

arvore_binaria.c

a guest
Nov 14th, 2019
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.67 KB | None | 0 0
  1. #include "arvore_binaria.h"
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5.  
  6. typedef struct no_arvore No_Arvore;
  7.  
  8. struct no_arvore{
  9. char string_item[5];
  10. No_Arvore* filho_dir;
  11. No_Arvore* filho_esq;
  12. };
  13.  
  14.  
  15. struct arvore_binaria{
  16. No_Arvore* raiz;
  17. int profundidade;
  18. };
  19.  
  20.  
  21.  
  22. No_Arvore* no_criar_arvore(char* string_item){
  23. No_Arvore* novo_no = (No_Arvore*)malloc(sizeof(No_Arvore));
  24.  
  25. if(!novo_no){
  26. return NULL;
  27. }
  28.  
  29. novo_no->filho_dir = NULL;
  30. novo_no->filho_esq = NULL;
  31. strcpy(novo_no->string_item, string_item);
  32.  
  33. return novo_no;
  34. }
  35.  
  36. Arvore_Binaria* arvore_criar(char* string_item){//cria arvore já com a raiz
  37. Arvore_Binaria* nova_arvore = (Arvore_Binaria*)malloc(sizeof(Arvore_Binaria));
  38.  
  39. if(!nova_arvore){
  40. return NULL;
  41. }
  42.  
  43. nova_arvore->profundidade = -1;
  44. nova_arvore->raiz = no_criar_arvore(string_item);
  45. return nova_arvore;
  46. }
  47.  
  48. void arvore_inserir_esquerda(Arvore_Binaria* arvore, char* string_item){
  49. if(!arvore){
  50. return;
  51. }
  52.  
  53.  
  54. No_Arvore* novo_no = no_criar_arvore(string_item);
  55.  
  56. if(!novo_no){
  57. printf("impossivel criar novo no\n");
  58. }
  59.  
  60. arvore->raiz->filho_esq = novo_no;
  61.  
  62. return;
  63. }
  64.  
  65.  
  66.  
  67. void arvore_inserir_direita(Arvore_Binaria* arvore, char* string_item){
  68. if(!arvore){
  69. return;
  70. }
  71.  
  72. No_Arvore* novo_no = no_criar_arvore(string_item);
  73.  
  74. if(!novo_no){
  75. printf("impossivel criar novo no\n");
  76. }
  77.  
  78. arvore->raiz->filho_dir = novo_no;
  79.  
  80. return;
  81. }
  82.  
  83. void arvore_apontar_null(Arvore_Binaria* arvore){//função utilizada para apagar a árvore da pilha
  84. if(!arvore){
  85. printf("arvore é null\n");
  86. return;
  87. }
  88.  
  89. arvore->raiz = NULL;
  90. return;
  91. }
  92.  
  93.  
  94. void arvore_desalocar_nos(No_Arvore** raiz){
  95. if((*raiz) != NULL){
  96. arvore_desalocar_nos(&(*raiz)->filho_esq);
  97. arvore_desalocar_nos(&(*raiz)->filho_dir);
  98.  
  99. free(*raiz);
  100. (*raiz) = NULL;
  101.  
  102. }
  103.  
  104. return;
  105. }
  106.  
  107. void arvore_desalocar(Arvore_Binaria** arvore){
  108. if(!arvore){
  109. printf("arvore é null\n");
  110. return;
  111. }
  112.  
  113. arvore_desalocar_nos(&(*arvore)->raiz);
  114. free(*arvore);
  115. (*arvore) = NULL;
  116.  
  117. return;
  118. }
  119. //a função arvore_fusao abaixo une duas árvores inseridas na pilha;
  120. //quando há uma inserção de operador na pilha, é necessário fazer o nó que contem o operador ter seu nó esquerdo apontado para
  121. //a subárvore armazenada no topo da pilha, e seu nó direito apontado para a árvore que ocupa a posição logo após o topo da pilha;
  122.  
  123. Arvore_Binaria* arvore_fusao_esquerda(Arvore_Binaria* subarvore_esquerda, Arvore_Binaria* arvore_mae ){
  124. if(!subarvore_esquerda || !subarvore_esquerda->raiz || !arvore_mae){
  125. printf("parametros incorretos para arvore_fusao_esquerda\n");
  126. return NULL;
  127. }
  128.  
  129. arvore_mae->raiz->filho_esq = subarvore_esquerda->raiz;
  130.  
  131. return arvore_mae;
  132. }
  133.  
  134.  
  135. Arvore_Binaria* arvore_fusao_direita(Arvore_Binaria* subarvore_direita, Arvore_Binaria* arvore_mae){
  136. if(!subarvore_direita || !subarvore_direita->raiz || !arvore_mae){
  137. printf("parametros incorretos para arvore_fusao_direita\n");
  138. return NULL;
  139. }
  140.  
  141. arvore_mae->raiz->filho_dir = subarvore_direita->raiz;
  142.  
  143. return arvore_mae;
  144. }
  145. /*void arvore_binaria_inserir(Arvore_Binaria* arvore, int item){//função só para arvore binaria de busca
  146. if(!arvore_binaria){
  147. return;
  148. }
  149.  
  150. if(arvore->raiz == NULL){
  151. No* raiz = no_criar(item);
  152. arvore->raiz = raiz;
  153. arvore->profundidade++;
  154. return;
  155. }
  156.  
  157. recursao_inserir(arvore->raiz, item);
  158.  
  159. arvore->profundidade++;
  160. }
  161.  
  162. void recursao_inserir(No* no, int item){
  163. if(no == NULL){
  164. no = no_criar(item);
  165. return;
  166. }
  167.  
  168. if(item > no->item){
  169. recursao_inserir(no->filho_dir, item);
  170. }
  171. else{
  172. recursao_inserir(no->filho_esq, item);
  173. }
  174. }
  175. */
  176. void arvore_imprimir_no(No_Arvore* no){
  177. if(!no){
  178. //printf("BOTOU O NULL PRA MAMA\n");
  179. return;
  180. }
  181.  
  182. printf("%s -", no->string_item);
  183. arvore_imprimir_no(no->filho_esq);
  184. arvore_imprimir_no(no->filho_dir);
  185. }
  186.  
  187. void arvore_imprimir(Arvore_Binaria* arvore){
  188. if(!arvore){
  189. printf("arvore é null\n");
  190. return;
  191. }
  192.  
  193. arvore_imprimir_no(arvore->raiz);
  194. printf("\n");
  195. printf("arvore impressa\n");
  196. }
  197.  
  198.  
  199. /*
  200. teste da arvore binaria e fusão
  201. int main(){
  202. printf("entrei na main\n");
  203.  
  204. Arvore_Binaria* nova_arvore = arvore_criar("R1");
  205.  
  206. arvore_inserir_esquerda(nova_arvore, "E1");
  207. arvore_inserir_direita(nova_arvore, "D1");
  208.  
  209. No_Arvore* novo_no = no_criar("E12");
  210. nova_arvore->raiz->filho_esq->filho_esq = novo_no;
  211.  
  212. printf("ARVORE UM:\n");
  213. arvore_imprimir(nova_arvore);
  214.  
  215. Arvore_Binaria* segunda_arvore = arvore_criar("R2");
  216.  
  217. arvore_inserir_esquerda(segunda_arvore, "E2");
  218. arvore_inserir_direita(segunda_arvore, "D2");
  219.  
  220. printf("ARVORE DOIS:\n");
  221. arvore_imprimir(segunda_arvore);
  222.  
  223.  
  224. Arvore_Binaria* arvore_mae = arvore_criar("+");
  225. Arvore_Binaria* arvore_um = arvore_fusao_esquerda(nova_arvore, arvore_mae);
  226. //arvore_apontar_null(nova_arvore);
  227.  
  228. printf("\nimprimindo após a fusão esquerda:\n");
  229. arvore_imprimir(arvore_um);
  230.  
  231. arvore_um = arvore_fusao_direita(segunda_arvore, arvore_mae);
  232. arvore_apontar_null(segunda_arvore);
  233. //imprimir a mae
  234.  
  235. printf("\nimprimindo após a fusão direita:\n");
  236. arvore_imprimir(arvore_um);
  237.  
  238. return 0;
  239. }
  240.  
  241. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement