Aula T13 BCC202 Árvores Túlio Toffolo www.decom.ufop.br/toffolo
Conceitos básicos n Organiza um conjunto de acordo com uma estrutura hierárquica. n Contém elementos que são chamados de nós n O pai de todos é a raiz 1º. da hierarquia n O contéudo de um nó pode ser de qualquer tipo que se deseje representar
Definição (Aho, Hopcroft e Ullman - 1983) q Um único nó é uma árvore. Este nó é raiz da árvore. q Suponha que n é um nó e T 1, T 2,..., T k sejam árvores com raizes n 1, n 2,..., n k, respectivamente. Podemos construir uma nova árvore tornando n a raiz e T 1, T 2,..., T k sejam subárvores da raiz. Nós n 1, n 2,..., n k são chamados filhos do nó n.
Caminho n Um caminho de n i a n k, onde n i é antecedente a n k, é a sequência de nós para se chegar de n i a n k. n Se n i é antecedente a n k, n k é descendente de n i n O comprimento do caminho é o número de nós do caminho 1.
Outros conceitos n Nó que não tem antecedente: raiz; n Nós que não tem descendentes são chamados de nós folhas. (Os outros são os nós internos) n A altura de um nó na árvore é o caminho de maior comprimento que se pode fazer deste nó a uma folha. n A altura da árvore é a altura de sua raiz. n A profundidade de um nó é o comprimento da raiz até o nó (só existe um caminho)
Caminhamento n A ordem dos filhos dos nós em uma árvore pode ser ou não significativa. q q Exemplos, no heap, a ordem dos filhos não tem significado Outros casos, pode se ter um significado (como veremos em pesquisa em árvores binárias) n Considera-se que se a e b são nós irmãos, e a está à esquerda de b, então todos seus descendentes estão à esquerda de b e todos os descendentes de b.
Caminhamento n Diversas formas de percorrer ou caminhar em uma árvore listando seus nós, as principais: q Pré-ordem (Pré-fixa) q Central (Infixa) q Pós-ordem (Pós-fixa) n Para todas elas: q q q q Se T é uma árvore nula, então a lista é nula. Se T é uma árvore de um único nó então a lista contém apenas este nó. O tratamento é diferenciado para os filhos O que muda é a ordem de apresentação da raiz.
Pré-Ordem n Pré-ordem: lista o nó raiz, seguido de suas subárvores (da esquerda para a direita), cada uma em pré-ordem. Procedimento PREORDEM (n: TipoNo); Início Fim Lista(n); Para cada filho f de n, da esquerda para direita faça PREORDEM(f);
Central n Central: lista os nós da 1ª. subárvore à esquerda usando o caminhamento central, lista o nó raiz n, lista as demais subárvores (a partir da 2ª.) em caminhamento central (da esquerda para a direita) Procedimento CENTRAL (n: TipoNo); Início Se Folha(n) então /* Folha retorna se n é uma folha da árvore ou não */ Lista(n); Senão CENTRAL (FilhoMaisEsquerda(n)); Lista (n); Para cada filho f de n, exceto o mais à esquerda, da esquerda para a direita faça CENTRAL (f); Fim;
Pós-Ordem n Pós-ordem: Lista os nós das subárvores (da esquerda para a direita) cada uma em pós-ordem, lista o nó raiz. Procedimento POSORDEM Início Para cada filho f de n, da esquerda para direita faça POSORDEM(f); Lista(n); Fim;
Classificação de Árvores n Árvore Estritamente Binária q Se cada nó não-folha em uma árvore binária não tem subárvores esquerda e direita vazias
Classificação de Árvores n Árvore Binária Completa q Uma árvore binária completa de nível n é a árvore estritamente binária, onde todos os nós folhas estão no nível n.
Classificação de Árvores n Árvore Binária Quase Completa q Uma árvore binária de nível n é uma árvore binária quase completa se: q Cada nó folha na árvore esta no nível n ou no nível n-1 q Para cada nó nd na árvore com um descentente direito no nível n, todos os descendentes esquerdos de nd que são folhas estão também no nível n
Exercício n Crie um TAD TNo em C cuja informação seja um inteiro e possua ponteiros para duas subárvores: esquerda e direita; n Escreva funções que recebam um ponteiro para a raiz da árvore e façam: q o caminhamento pré-ordem q o caminhamento pós-ordem q o caminhamento central n Entregar em 15min ou postar no moodle (com main e rodando) até as 23h55 de hoje.
TAD TNo typedef int TItem; typedef struct TNo* Apontador; typedef struct TNo TItem Item; Apontador pesq; Apontador pdir; TNo; Algoritmos e Estrutura
Caminhamento: PreOrder void PreOrderRec(TNo* praiz) if (praiz == NULL) return; printf( %d\t,praiz->item); PreOrderRec(pRaiz->pEsq); PreOrderRec(pRaiz->pDir);
Caminhamento: InOrder void InOrderRec(TNo* praiz) if (praiz == NULL) return; InOrder(pRaiz->pEsq); printf( %d\t,praiz->item); InOrder(pRaiz->pDir);
Caminhamento: PostOrder void PostOrderRec(TNo* praiz) if (praiz == NULL) return; PostOrder(pRaiz->pEsq); PostOrder(pRaiz->pDir); printf( %d\t,praiz->item);
Caminhamento: PreOrder não recursivo void PreOrderIt(TNo* praiz) TNo* paux; TPilha P; FPVazia(&P); PEmpilha(&P,&pRaiz); while(!pehvazia(&p)) PDesempilha(&P,&pAux); if (paux == NULL) continue; printf( %d\t,paux->item); PEmpilha(&P,pAux->pDir); PEmpilha(&P,pAux->pEsq);
Caminhamento: InOrder não recursivo void InOrderIt(TArvoreBin* praiz) TArvoreBin* paux; TPilha P; FPVazia(&P); PEmpilha(&P,pRaiz); paux = praiz->pesq; while(!pehvazia(&p) paux!= NULL) if (paux == NULL) PDesempilha(&P,&pAux); printf("%d\t",paux->item); paux = paux->pdir; else PEmpilha(&P,pAux); paux = paux->pesq;
Caminhamento: PostOrder não recursivo void PostOrderIt(TArvoreBin* praiz) TArvoreBin *paux; TPilha P1,P2; FPVazia(&P1); FPVazia(&P2); PEmpilha(&P2,pRaiz); paux = praiz; while(!pehvazia(&p2) ) PDesempilha(&P2,&pAux); PEmpilha(&P1,pAux); if (paux->pesq!= NULL) PEmpilha(&P2,pAux->pEsq); if (paux->pdir!= NULL) PEmpilha(&P2,pAux->pDir); while(!pehvazia(&p1) ) PDesempilha(&P1,&pAux); printf("%d\t",paux->item);
TADs TNo e TArvoreBin typedef int TItem; typedef struct TNo* Apontador; typedef struct No TItem iitem; struct No* pesq; /* Apontador pesq; */ struct No* pdir; /* Apontador pdir; */ TNo; typedef struct TNo* praiz; TArvoreBin;