32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

Embed Size (px)

Citation preview

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    1/48

    rvores

    1

    Prof. Cristhian Heck, M.Sc.

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    2/48

    INTRODUOrvores

    2

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    3/48

    Introduo

    rvores so estruturas de dados utilizadas paraarmazenar e recuperar dados de forma rpida eeficiente;

    rvores no so lineares, ou seja, os elementos no sodispostos em forma sequencial;

    3

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    4/48

    Introduo

    rvores so amplamente utilizadas e possuem diversasestratgias de implementao;

    Cada estratgia tem um conjunto especfico dealgoritmos para armazenamento e recuperao dosdados;

    rvores genealgicas so anlogas s estruturas dedados rvores.

    4

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    5/48

    COMPOSIOrvores

    5

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    6/48

    Composio

    As rvores so compostas por:

    Nodos/Ns: so os elementos inseridos em umarvore;

    Arestas: fazem a ligao entre 2 nodos;

    6

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    7/48

    Composio

    O primeiro Nodo de uma rvore chamado de Raiz;

    Todos os demais nodos da rvore sero seusdescendentes;

    Nodos que no tenham filhos sero chamados de folhas,ou terminais;

    Os demais nodos so ditos intermedirios, ou s vezes:galhos.

    7

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    8/48

    Composio

    As principais propriedades de cada nodo so:

    Ordem/Grau: Indica o nmero de filhos que o nodopossui;

    Nvel/Altura/Profundidade: Indica a distncia donodo em relao raiz;

    A rvore tambm possu valores de ordem e de nvel.

    Ambos os valores sero assumidos com base nomaior valor encontrado em qualquer nodo.

    8

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    9/48

    A

    CB

    D FE

    G IH J

    Nvel 0N A = RaizOrdem 2

    Nvel 1N B = GalhoOrdem 3

    N C = FolhaOrdem 0

    Nvel 2N D = FolhaOrdem 0N E = GalhoOrdem 4N F = FolhaOrdem 0

    Nvel 3N G = FolhaOrdem 0N H = FolhaOrdem 0N I = FolhaOrdem 0N J = FolhaOrdem 0

    rvore: Nvel 3 e Ordem 4

    Ns / Nodos

    Arestas

    Nvel

    Ordem

    9

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    10/48

    OUTRAS PROPRIEDADESrvores

    10

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    11/48

    Propriedades

    Qualquer nodo de uma rvore pode ser chamado de raizpara uma sub-rvore;

    Um Nodo Pai um nodo conectado diretamente acimade outro nodo;

    Um Nodo Filho um nodo conectado diretamente abaixo

    de outro nodo;

    Nodos Irmos compartilham o mesmo nodo pai;11

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    12/48

    Propriedades

    Nodos Ancestrais so todos os nodos que esto acima deum nodo, com ligao direta ou indireta;

    Nodos Descendentes so todos os nodos que estoabaixo de um nodo, com ligao direta ou indireta;

    12

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    13/48

    EXERCCIOSrvores

    13

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    14/48

    A

    CB D

    F

    E

    G IH MK N

    O P TSR U X

    765

    #

    4

    &

    3WY Z

    8 9

    14

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    15/48

    RVORES BINRIASrvores

    15

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    16/48

    rvores Binrias

    rvores Binrias so rvores com todas aspropriedades vistas anteriormente, porm comalgumas regras:

    A Ordem mxima da rvore 2;

    Todos os nodos de uma sub-rvore, do filho direita, sero maiores do que o nodo pai;

    Todos os nodos de uma sub-rvore, do filho esquerda, sero menores do que o nodo pai;

    Geralmente chamadas de rvores binrias depesquisa; 16

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    17/48

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    18/48

    A

    CB

    D FE G

    IH

    J

    Nvel 0

    N A = RaizOrdem 2

    Nvel 1N B = GalhoOrdem 2N C = GalhoOrdem 2

    Nvel 2N D = FolhaOrdem 0N E = GalhoOrdem 2N F = FolhaOrdem 0N G = FolhaOrdem 0

    Nvel 3

    N H = GalhoOrdem 1N I = FolhaOrdem 0

    rvore Binria: Nvel 4 e Ordem 2

    Ns / Nodos

    Arestas

    Nvel

    Ordem

    Nvel 4N J = FolhaOrdem 0

    18

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    19/48

    IMPLEMENTADO RVORES BINRIASrvores

    19

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    20/48

    Implementando

    rvores so implementadas com elementos dinmicos,assim como nas listas encadeadas;

    Nas listas, tnhamos apenas um prximo elemento. Nasrvores, cada elemento ter dois prximos:

    Filho da Esquerda; e

    Filho da Direita.

    20

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    21/48

    Implementando

    public class Nodo

    {

    public int numero;

    //outros atributos

    //...

    public Nodo Esquerda;

    public Nodo Direita;

    public Nodo Pai; //Opcional

    }

    21

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    22/48

    Implementando

    Construtor para classe nodo:

    publicNodo(int nro)

    {

    this.numero = nro;

    this.Esquerda = null;

    this.Direita = null;this.Pai = null;

    } 22

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    23/48

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    24/48

    Implementando

    Vale lembrar das regras mais importantes de navegaonas rvores binrias de pesquisa:

    Elementos menores estaro esquerda;

    Elementos maiores estaro direita.

    24

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    25/48

    Implementando

    Insero:

    Se a raiz estiver vazia:

    Insere na raiz.

    Seno: Navega pela rvore (subindo de nvel)

    comparando o valor a ser inserido com os valoresdos nodos visitados;

    Se Menor Esquerda; e Se Maior Direita;

    Quando encontrar um nodo sem filho para o ladopor onde deveria seguir, insere o novo elemento

    nesta posio.

    25

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    26/48

    public void Inserir(Nodo novo) {

    novo.Direita = null;novo.Esquerda = null;

    novo.Pai = null;if(raiz == null)raiz = novo;

    else {Nodo aux = raiz;while (aux != null) {

    if(novo.numero < aux.numero) {if(aux.Esquerda == null) {

    aux.Esquerda = novo;break;

    }

    aux = aux.Esquerda;}

    else {if(aux.Direita == null) {

    aux.Direita = novo;break;}aux = aux.Direita;

    }}novo.Pai = aux;

    }}

    26

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    27/48

    Implementando

    Pesquisa:

    Se a raiz estiver vazia:

    No encontrado!

    Seno:

    Navega pela rvore (subindo de nvel) comparandoo valor pesquisado com os valores dos nodosvisitados:

    Igual Encontrado!

    Menor Desloca Esquerda; Maior Desloca Direita;

    Se percorrer toda a rvore sem encontrar:

    No encontrado!27

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    28/48

    ImplementandopublicNodo Pesquisar(int nro)

    {

    Nodo aux = raiz;

    while (aux != null)

    {

    if(aux.numero == nro)return aux;

    if(nro < aux.numero)

    aux = aux.Esquerda;

    elseaux = aux.Direita;

    }

    return null;

    }

    28

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    29/48

    Implementando

    Navegar por todos os Nodos:

    6

    82

    1 4

    329

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    30/48

    Implementando

    Listar Contedo da rvore:

    A listagem da rvore pode ser feitas de trs formasbsicas:

    Em ordem: (crescente ou decrescente)

    1, 2, 3, 4, 6, 8

    Pr-ordem:

    Pais processados antes

    6, 2, 1, 4, 3, 8 Ps-ordem:

    Filhos processados antes

    1, 3, 4, 2, 8, 6

    6

    82

    1 4

    3

    30

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    31/48

    Implementando

    Listar Contedo da rvore:

    Pode ser implementado com diversas estratgias:

    Recursividade;

    Pilha; Busca do subsequente.

    6

    82

    1 4

    3

    31

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    32/48

    Listar com Recursividade

    public static void Listar(Nodo inicio) {

    if(inicio == null) {

    return;

    }

    Listar(inicio.Esquerda);

    System.out.println(inicio.numero);

    Listar(inicio.Direita);

    }

    32

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    33/48

    Implementando

    Remoo de Nodos:

    Aux = Pesquisar(Nodo)

    Se Aux == NULL no encontrado!

    Seno: Se Aux for raiz:

    Sem filhos

    Com um filho

    Com dois filhos

    Seno Sem filhos

    Com um filho

    Com dois filhos 34

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    34/48

    Implementando

    Remoo de Nodos Raiz sem filhos:

    Raiz = null;

    35

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    35/48

    Implementando

    Remoo de Nodos:

    Aux = Pesquisar(Nodo)

    Se Aux == NULL no encontrado!

    Seno: Se Aux for raiz:

    Sem filhos

    Com um filho

    Com dois filhos

    Seno Sem filhos

    Com um filho

    Com dois filhos 36

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    36/48

    Implementando

    Remoo de Nodos Raiz com um filho:

    Raiz = Filho nico da Raiz;

    37

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    37/48

    Implementando

    Remoo de Nodos:

    Aux = Pesquisar(Nodo)

    Se Aux == NULL no encontrado!

    Seno: Se Aux for raiz:

    Sem filhos

    Com um filho

    Com dois filhos

    Seno Sem filhos

    Com um filho

    Com dois filhos 38

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    38/48

    Implementando

    Remoo de Nodos Raiz com dois filhos:

    Substituto = Subsequente(Raiz); //Aux Substitui (Raiz pelo Substituto);

    39

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    39/48

    Implementando

    Remoo de Nodos:

    Aux = Pesquisar(Nodo)

    Se Aux == NULL no encontrado!

    Seno: Se Aux for raiz:

    Sem filhos

    Com um filho

    Com dois filhos

    Seno Sem filhos

    Com um filho

    Com dois filhos 40

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    40/48

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    41/48

    Implementando

    Remoo de Nodos:

    Aux = Pesquisar(Nodo)

    Se Aux == NULL no encontrado!

    Seno: Se Aux for raiz:

    Sem filhos

    Com um filho

    Com dois filhos

    Seno Sem filhos

    Com um filho

    Com dois filhos 42

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    42/48

    Implementando

    Remoo de Nodos No Raiz / 1 filho:

    PaiAux = Aux.Pai;

    FilhoAux = Aux.Filho; (esquerda, ou direita) Se (PaiAux.Esquerda == Aux) ento

    PaiAux.Esquerda = FilhoAux;

    Seno

    PaiAux.Direita = FilhoAux;

    43

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    43/48

    Implementando

    Remoo de Nodos:

    Aux = Pesquisar(Nodo)

    Se Aux == NULL no encontrado!

    Seno: Se Aux for raiz:

    Sem filhos

    Com um filho

    Com dois filhos

    Seno Sem filhos

    Com um filho

    Com dois filhos 44

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    44/48

    Implementando

    Remoo de Nodos No Raiz / 2 filhos:

    Substituto = Subsequente(Aux);

    Substitui (Aux pelo Substituto);

    45

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    45/48

    Implementando (1/3)public boolean Remover(Nodo remover)

    {

    if(remover == null)

    return false;

    //Informao paterna

    Nodo pai = remover.Pai;

    //Existe um substituto nico ou nenhum?Nodo subst;

    if(remover.Esquerda == null || remover.Direita == null)

    {

    //Ambos so null? sem substituto

    if(remover.Esquerda == remover.Direita)subst = null;

    else

    { //Se direita vazia, substituto esta na esquerda e vice versa

    if(remover.Direita == null)

    subst = remover.Esquerda;

    46

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    46/48

    Implementando (2/3)else

    subst = remover.Direita;

    }//Se tiver um pai, atualiza vinculo dos filhos, seno atualiza a raiz.

    if(pai != null)

    {

    if(pai.Esquerda == remover)

    pai.Esquerda = subst;

    else

    pai.Direita = subst;

    }

    else

    raiz = subst;

    //Se tiver um filho substituto, atualiza seu vinculo paterno

    if(subst != null)

    subst.Pai = pai;

    return true;

    }

    47

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    47/48

  • 7/28/2019 32157_136386_estrutura_de_dados_-_arvores_-_binaria.pdf

    48/48

    Implementandoprivate boolean SubstituirNodo(Nodo original, Nodo novo)

    {

    if(original == null || novo == null)

    return false;

    Nodo pai = original.Pai;

    if(pai != null)

    {if(pai.Esquerda == original)

    pai.Esquerda = novo;

    else

    pai.Direita = novo;

    }novo.Pai = pai;

    Nodo filho = original.Esquerda;

    if(filho != null)

    filho.Pai = novo;

    filho = original.Direita;

    if(filho != null)filho.Pai = novo;

    novo.Direita = filho;

    return true;

    Continuao...

    49