ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti



Documentos relacionados
Linguagem C: Árvores Binarias

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

Métodos Computacionais. Árvores

2ª Lista de Exercícios

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2

INF 1007 Programação II

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

EAD Árvore árvore binária

Busca. Pesquisa sequencial

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

Estruturas de Dados Pilhas, Filas e Deques

DAS5102 Fundamentos da Estrutura da Informação

FUNDAÇÃO EDUCACIONAL DE ITUIUTABA

Árvores Binárias de Busca

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 CES-11 CES-11

ESTRUTURA DE DADOS PILHA

ESTRUTURAS DE DADOS II MSc. Daniele Carvalho Oliveira

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

Figura 13.1: Um exemplo de árvore de diretório.

Programas operam sobre dados. Dados são relacionados e possuem estrutura. Como representar e manipular dados em um computador

Algoritmos e Estruturas de Dados: Árvore Binária

Estrutura de Dados. Introdução a Ponteiros. Prof. Gerson Borges Estrutura de Dados I 1

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Estruturas de Dados Aula 15: Árvores 17/05/2011

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Listas Duplamente Encadeadas

Árvores Binárias de Busca

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

PROGRAMAÇÃO II 4. ÁRVORE

Pesquisa em Memória Primária. Prof. Jonas Potros

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação

Algoritmos e Estrutura de Dados II

Orientação a Objetos

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Aula 3 Alocação Dinâmica

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

Complexidade de Algoritmos

Estruturas de Dados I

Árvore Binária de Busca

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

Pesquisa em Memória Primária. Prof. Jonas Potros

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais:

Índice. Capítulo 2 Estrutura de Dados sequencial com armazenamento sequencial

Estruturas de Dados Aula 11: TAD Pilha 09/05/2011

Pilhas. Profa Morganna Diniz

EAD Árvore - representação usando listas ligadas

Primeiro Curso de Programação em C 3 a Edição

struct LISTA item quant

DAS5102 Fundamentos da Estrutura da Informação

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

Algoritmos e Estrutura de Dados. Prof. Tiago A. E. Ferreira

Introdução a POO. Introdução a Linguagem C++ e POO

Árvores. Algoritmos e Estruturas de Dados 2005/2006

Algoritmos e Estrutura de Dados III. Árvores

Estruturas de Dados Árvores

Algoritmos e Programação Estruturada

1. Introdução Definição Conceitos relacionados... 2

Experimentos com a memória cache do CPU

Pesquisa Sequencial e Binária

ESTRUTURA DE DADOS DCC013

BC1424 Algoritmos e Estruturas de Dados I. Aula 16: Árvores (introdução) Prof. Jesús P. Mena-Chalco. jesus.mena@ufabc.edu.br

-Estrutura linear de acesso seqüencial que ordena seus elementos pela seqüência cronológica de sua entrada;

Árvores Binárias Balanceadas

Análises Geração RI (representação intermediária) Código Intermediário

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

Introdução a Java. Hélder Nunes

Aula 1 Tipo Abstrato de Dados

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Universidade Estadual de Mato Grosso do Sul - Curso de Ciência da Computação Disciplina: Estruturas de Dados Profª. Raquel Marcia Müller

Estrutura de Dados Pilha (Stack)

Web site. Objetivos gerais. Introdução. Profa. Patrícia Dockhorn Costa

Computação II Orientação a Objetos

17 - Funções e Procedimentos em C Programação Modular

Algoritmos de pesquisa. Tabelas de dispersão/hash

Geração de código intermediário. Novembro 2006

10. Listas Encadeadas

PROGRAMA DE DISCIPLINA

Estruturas de Dados com Jogos. Capítulo 3 Filas - Alocação Sequencial e Estática

Introdução à Programação

ALGORITMOS E ESTRUTURAS DE DADOS Terceiro Trabalho Prático Recursividade e Pilhas

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

PROGRAMAÇÃO II 3. FILA DINÂMICA

Introdução à Programação. Recursão

Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II

ESTRUTURAS DE DADOS AVANÇADAS (INF 1010) (a) Seja um TAD definido por uma lista circular implementada em um vetor.

INF 1007 Programação II

Algoritmos de Busca em Tabelas

CT-234. Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Conceitos de Linguagens de Programação

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

EAD Fila. - algumas operações realizam-se na frente/cabeça e outras na cauda da Fila

JSP - ORIENTADO A OBJETOS

Transcrição:

ESTRUTURAS DE DADOS I Notas de Aula

1 SUMÁRIO 1. INTRODUÇÃO... 2 1.1 Array (vetores)... 2 2. BUSCA DE ELEMENTOS... 3 2.1 Busca Seqüencial... 3 2.2 Busca Binária... 3 2.3 Busca Indexada... 3 2.4 Busca Hash... 3 3. PONTEIROS... 4 3.1 Alocação de Memória... 4 4. LISTAS... 5 4.1 Listas Ligadas... 5 4.2 Variações de Listas Ligadas... 6 4.3 Lista Circular... 7 4.4 Lista Duplamente Encadeada... 8 4.5 Comparação de Listas... 8 5. RECURSÃO... 8 5.1 Recursão de Cauda... 8 5.2 Recursão de Cabeça... 9 5.3 Resolução de Recursões... 9 6. FILAS... 10 6.1 Filas com alocação dinâmica... 10 6.2 Filas usando Vetores... 10 7. PILHAS... 12 7.1 Pilhas com alocação dinâmica... 102 7.2 Pilhas usando Vetores... 10 8. ÁRVORES... 133 8.1 Percurso em Ordem (ERD)... 144 8.2 Percurso em Pré Ordem (RED)... 155 8.3 Percurso em Pós Ordem (EDR)... 155 8.4 Inserção em Árvore Recursivamente... 155 8.5 Impressão Seguindo o Modelo Em Ordem... 166 8.6 Percurso em Largura... 166 9. TIPOS DE ÁRVORES BINÁRIAS... 177 9.1 Árvore Binária vazia/completa... 177 9.2 Árvore Estritamente Binária... 177 9.3 Árvores Binárias Similares... 188 9.4 Árvores Binárias Simétricas... 188 9.5 Árvores para Avaliação de Expressões... 19 9.5 Árvores AND/OR... 199

2 1. INTRODUÇÃO Estruturas de dados são implementações computacionais de tipos de dados abstratos (TDA). Esses tipos de dados complementam os tipos básicos de cada linguagem de programação (ex: char, int, float, double, entre outros). Além disso, definem valores e operações que podem ser realizados sobre esses valores. As principais funções das estruturas de dados são: Prover abstrações (modelos) que possam representar problemas; Possibilitar formas de implementação para solucioná-las computacionalmente. 1.1 Array (vetores) São estruturas ordenadas, unidimensionais e homogêneas, isto é, armazenam elementos do mesmo tipo. Exemplo: A 1 5 3 4 12 8 6 2 [0] [1] [2] [3] [4] [5] [6] [7] Exercício: Implemente uma função que: Leia uma seqüência de 20 números inteiros, armazene-os em um vetor e calcule a média desses valores; Imprima o valor máximo e mínimo; Procure um número no vetor e retorne 1 (true) caso ele esteja presente e 0 (false) caso contrário. Discuta variações na implementação proposta, comparando-as. Tabela: Número de Operações x Tamanho da entrada 1 n log 2 n n² n³ 2 n n n 1 1 1 0 1 1 2 1 10 1 10 4 100 1K 1K 10G 100 1 100 7 10K 1M 10G 100 100 >> 1K 1 1K 10 1M 1G 100 100 1K 1K >>

3 2. BUSCA DE ELEMENTOS 2.1 Busca Seqüencial Na busca seqüencial os elementos são procurados um a um, geralmente a partir de estruturas lineares de armazenamento. Para buscar um elemento em um conjunto de n números, ou melhor, elementos, são necessárias até n comparações (média de n/2 comparações). 2.2 Busca Binária 3 8 15 17 18 22 28 Na busca binária, os elementos são procurados dividindo-se uma seqüência ordenada em dois subconjuntos. O elemento procurado é comparado ao central, O processo de busca continua na semi-seqüência apropriada. Em um conjunto de n elementos, são necessárias até log 2 (n+1) comparações, sendo normalmente representada por log 2 n. 2.3 Busca Indexada Nesse tipo de busca, usa-se uma estrutura auxiliar denominada índice. Uma das formas mais simples de índices são tags, que funcionam como flags. 3 8 15 17 18 22 28 30 31 35 37 39 41 1 10 20 30 40 2.4 Busca Hash Nesse tipo de busca utiliza-se uma função injetora f(ch) = sl, onde: ch: chave de busca; sl: slot de armazenamento. Implementa-se sl=(ch mod 10), por exemplo: Slots: 0 1 2 3... 9 30 31 22 3 35 41

4 Exercícios: 1- Programe uma função que implemente Busca Binária em um vetor ordenado. 2- Compare os diferentes métodos de busca que você conhece, identificando virtudes e defeitos. Identifique tipos de aplicações, onde seria adequado utilizar cada um deles. 3- Implementar uma função que a realize a Busca Binária de um elemento em um vetor de inteiros. A função deve aceitar como parâmetros o número a ser procurado, o número de elementos do vetor e o vetor ordenado. Deve retornar 1 (true) caso o elemento esteja presente no vetor e 0 (false) caso contrário. 3. PONTEIROS Ponteiros são variáveis que armazenam endereços de memória. São úteis para: Modificar o conteúdo de parâmetros de funções; Aumentar a eficiência de programas; Manipular estruturas dinâmicas, como listas, filas, pilhas, grafos, árvores etc. Assim são construções extremamente poderosas na resolução de problemas, mas precisam ser manipuladas com cuidado. Erros de programação com ponteiros estão entre os mais difíceis de serem corrigidos. Para minimizar isso, utiliza-se a convenção de inicializar ponteiros com NULL (normalmente igual à zero). Exemplo: int contador; int *pont; contador = 1; pont = &contador; printf ( Endereço da variável %d\n, pont); printf ( Conteúdo da variável %d\n, *pont); Assim, as principais operações com ponteiros são: &, que devolve o endereço da variável; *, que devolve o conteúdo da variável. 3.1 Alocação de Memória A alocação de ponteiros em memória varia de acordo com o compilador e a arquitetura utilizada. A seguir, é apresentado um modelo típico de alocação em memória.

5 Programa Variáveis Globais Heap Estruturas Dinâmicas Variáveis locais endereços Pilha (stack) Para alocar espaço em memória existe o comando malloc(nº de bytes); Para liberar esse espaço de memória, usa-se o comando free (ponteiro); 4. LISTAS 4.1 Listas Ligadas Uma lista ligada é uma estrutura de dados dinâmica e seqüencial, sendo acessada através de um ponteiro inicial. Representação gráfica Início Chave Chave Chave Próximo Próximo Próximo NULL Declarações struct no int chave; struct no *proximo; ; struct no *inicio; Alocação de Elemento #include <stdlib.h> inicio 5 NULL inicio = (struct no *) malloc (sizeof (struct no)); inicio->chave = 5; inicio->proximo = NULL;

6 Ligação de Elementos struct no *inicio, *aux; inicio = (struct no*) malloc (sizeof(struct no)); aux = (struct no*) malloc (sizeof(struct no)); inicio->chave = 5; inicio->proximo = aux; aux->próximo = 10; aux->próximo = NULL; inicio 5 10 NULL Exercício: Criar uma lista ligada com 5 nós; Ponteiros Especiais Para a manipulação de estruturas dinâmicas, alguns ponteiros são particularmente importantes. Head (cabeça): ponteiro que dá acesso à estrutura e denota seu início; Tail (cauda): ponteiro que dá acesso ao final da estrutura. É necessário em alguns tipos de estruturas como filas e listas com inserção no final. NULL: flag que indica o final do caminho de ponteiros, impedindo o referenciamento a endereços de memória inconsistentes. 4.2 Variações de Listas Ligadas Lista Ligada com inserção no Final inicio 1 fim fim 2 N-1 N... NULL x

7 Lista Ligada com inserção no Início N inicio N-1 N-2 1 fim... NULL Lista com inserção em Ordem inicio 1 K-1 K+1 N fim K... NULL Exercício: Considere uma lista ligada, acessada por um ponteiro de início (além da declaração da estrutura nó dada anteriormente). a-) Faça um algoritmo que percorrera todas as listas, imprimindo os valores dos campos chave. b-) Faça uma função que insira um número (inteiro) n no início da lista. c-) Faça um função que insira um inteiro n em ordem crescente, na lista ligada. 4.3 Lista Circular O ponteiro do ultimo nó (Tail) aponta para o primeiro (Head), formando um ciclo. inicio... (struct no*)insere_circular((struct no*)inicio, int n);

8 4.4 Lista Duplamente Encadeada Um determinado nó aponta tanto para seu sucessor quanto para seu antecessor. inicio... (struct no*)insere_dupla((struct no*)inicio, int n); 4.5 Comparação de Listas Duas listas são iguais quando possuem a mesma estrutura e número de elementos, e os valores dos nós correspondentes são iguais. Exercício: 1-) Faça uma função iterativa que receba os ponteiros de duas listas e retorne 1 caso elas sejam iguais e 0 caso contrário. 2-) Idem usando função recursiva. 3-) Inserir elementos no fim da uma lista com recursão. 5. RECURSÃO 5.1 Recursão de Cauda Ocorre quando a chamada recursiva é realizada após a execução das demais instruções. Sua execução é muito similar às versões iterativas com laço de repetição. Exemplo: void imprime (no * lista) if( lista!= NULL ) printf ( %d, lista->chave); imprime (lista->prox);

9 5.2 Recursão de Cabeça Quando a chamada recursiva é realizada antes da execução das demais instruções. Nesse caso, essas instruções são realizadas na volta da recursão (em ordem inversa das chamadas). Exemplo: void imprime (no * lista) if (lista!= NULL) imprime (lista -> prox); printf ( %d, lista->chave); 5.3 Resolução de Recursões Uma vez que as recursões são baseadas em induções, podemos resolvê-las usando o seguinte método. 1. Especular a resposta para o caso mais simples, também chamada critério de parada, por exemplo, quando n = 0 (n = número de elementos de entrada). 2. Supor que sabemos resolver o problema para n-1 elementos. 3. Especificar a solução para n elementos, baseando na resposta para o caso mais simples, buscando resolver o caso mais geral. Exercícios: 1-) Calcular o fatorial de n, n Ν. 2-) Calcular o produto de 2 números naturais, a partir de somas. Ex: 4 3 = 4 + 4 + 4. 3-) Gerar a seqüência de Fibonacci, dada por: fib(0) = 0 fib(1) = 1 fib( n) = fib( n 1) fib( n 2) 4-) Calcular o número de nós de uma lista ligada. 5-) Calcular a soma dos elementos de uma lista ligada.

10 6-) Resolver o problema das torres de Hanói. Origem Destino Auxiliar 6. FILAS 6.1 Filas com alocação dinâmica Filas são estruturas de dados lineares com uma política de inserção e remoção de elementos sem definida. Essa política é denominada FIFO (First In, First Out), ou seja, os elementos são inseridos e retirados da fila na mesma ordem. Aplicações: Cliente servidor. Escalonamento de processos, em Sistemas Operacionais. Análise de desempenho de sistema (ex.: redes de computadores). Threads entre outras. Implementação: Simples, através de uma lista com inserção em um extremo e remoção de elementos no outro. Exemplo: Início (retirada) Fim (inserção) 1 2 3 4 NULL 6.2 Filas usando Vetores Embora o uso de vetores exija a definição do número máximo de elementos a priori, em alguns casos seu uso pode ser desejável ou mesmo necessário. A simulação de filas dinâmicas através de vetores estáticos pode ser realizada através de algoritmos similares aos conhecidos.

11 Fila vazia. a1 a1 a2 Inserção de a1. Inserção de a2. a2 a3 a4 Remoção de a1, e inserção de a3 e a4.... a4 a5 a6 a7 a8 Fila cheia? Outro algoritmo muito conhecido também é usando uma array circular, neste caso ao removermos um elemento do vetor e todos os seus sucessores avançam uma posição. Fila vazia. a1 a1 a2 Inserção de a1. Inserção de a2. a2 a3 a4 a5 Remoção de a1, e inserção de a3 e a4.... a4 a5 6a a7 a8

12 7. PILHAS 7.1 Pilhas com alocação dinâmica Uma pilha (stack) é uma estrutura de dados linear que implementa a estratégia FILO (First In, Last Out) as vezes também chamada de LIFO. Sua estrutura se assemelha como uma pilha de livros. Ao empilharmos livros em uma mesa, o primeiro a ser retirado é o ultimo que foi colocado. Aplicações: Durante a execução de um programa, para o armazenamento de valores de variável local. Muito usada em SO s e compiladores. As operações similares às das filas, com inserção de elementos (push) e remoção (pop) na mesma extremidade. Implementação:

13 7.2 Pilhas usando vetores Diferente do uso de filas, nas pilhas, o ultimo elemento que entrou é o primeiro a sair (FILO). Por exemplo: Pilha vazia. a1 a1 a2 Inserção de a1. Inserção de a2. a1 a3 a4 Remoção de a2, e inserção de a3 e a4. 8. ÁRVORES Árvores são estruturas de dados que possuem as seguintes características: Cada nó (a exceção de um) possui um nó antecessor, chamada pai e zero ou mais nós sucessores chamadas filhos. O nó sem antecessor é denominado raiz. Os nós que não possuem sucessores são chamadas folhas. As árvores são estruturas recursivas. Pai Sub-árvore Filho Folhas

14 Ordem de uma árvore é o número máximo de filhos que seus nós possuem. Em particular, uma árvore de ordem 2 é denominada binária. Uma Árvore binária de busca é uma árvore binária onde os valores dos nós à esquerda são menores que o valor do nó pai, e os da direita são maiores. A altura de uma árvore é o maior caminho entre a raiz e suas folhas. Exemplo de árvore binária de busca: 30 Raíz 18 42 7 25 34 50 8.1 Percurso em Ordem (ERD) Nesse tipo de percurso os nós da árvore são visitados na seguinte ordem: esquerda, raiz e direita recursivamente, ou seja, a saída estará em ordem crescente. Exemplo: 12 Raíz 8 15 5 9 13 20 Algoritmo: void Ordem(Struct No *raiz) if(raiz!= NULL) preordem(raiz->esquerda); printf( %d, raiz->inf); preordem(raiz->direita); Saída: 5, 8, 9, 12, 13, 15, 20

15 8.2 Percurso em Pré Ordem (RED) Percurso dos nós na seqüência. Raiz, esquerda, direita. Algoritmo: void preordem(struct No *raiz) if(raiz!= NULL) printf( %d, raiz->inf); preordem(raiz->esquerda); preordem(raiz->direita); Saída: 12, 8, 5, 9, 15, 13, 20 8.3 Percurso em Pós Ordem (EDR) Algoritmo: Esquerda, direita, raiz. void preordem(struct No *raiz) if(raiz!= NULL) preordem(raiz->esquerda); preordem(raiz->direita); printf( %d, raiz->inf); 8.4 Inserção em Árvore Recursivamente void insere (no**raiz, int n) if(*raiz == NULL) (*raiz)=(struct no*)malloc(sizeof(struct no)); (*raiz)->chave = n; (*raiz)->esq = (*raiz)->dir = NULL; else if(n < (*raiz)->chave) insere(&(*raiz)->esq, n); else if(n > (*raiz)->chave) insere(&(*raiz)->dir, n); else printf( Número já existe!\n );

16 8.5 Impressão Seguindo o Modelo Em Ordem void emordem(no *raiz) if(raiz!= NULL) emordem(raiz->esq); printf( %d, raiz->chave); emordem(raiz->dir); //---------------------------(*) Para mudar o pós-ordem basta inserir o printf na frente da 2ª chamada de função (*) 8.6 Percurso em Largura Segundo essa estratégia os nós são visitados em largura, isto é, por níveis. 12 8 15 5 9 20 Saída: 12, 8, 15, 5, 9, 20 Exercícios 1-) Implementar uma função que imprima os valores de uma árvore binária em largura. 2-) Função que retorne o maior valor de nó. 3-) Função que retorne a soma dos valores dos nós. 4-) Função que compare 2 árvores binárias e retorne 1 caso sejam iguais e 0 quando caso contrário. Dicas: Um critério para sabermos se é melhor um código iterativo ou recursivo é contar o número de recursões. Com recursão verifique antes de chamar a função se a árvore é vazia, pois isso facilita extremamente o trabalho.

17 9. TIPOS DE ÁRVORES BINÁRIAS 9.1 Árvore Binária vazia/completa Uma árvore binária vazia é aquela que não possui nenhum nó. Uma árvore binária completa é aquela que possui o número máximo de nós possível, considerando qualquer árvore binária de mesma altura. Raíz (NULL) Árvore Binária Vazia Árvore Binária 9.2 Árvore Estritamente Binária Uma árvore é estritamente binária quando todos seus nós são folhas ou possuem infinitos filhos. Algoritmo int estritbinaria(struct no*aux) if(arv->esq == NULL && arv->dir == NULL) return 1; else if (arv->esq == NULL arv->dir == NULL) return 0; else return (estritbinaria(arv->esq) && estritbinaria(arv->dir)); Uma árvore vazia deve ser tratada na função que a chama, pois não temos argumentos para tratá-la aqui. Ela deve ser indicada somente como vazia.

18 9.3 Árvores Binárias Similares Duas árvores binárias são similares quando possuírem a mesma estrutura, independentemente dos valores dos nós. 20 Árv 1 20 Árv 2 10 43 8 50 5 37 3 27 28 39 38 39 Algoritmo: int similares(no*arv1, no*arv2) if(arv1 == NULL && arv2 == NULL) return 1; else if (arv1 == NULL arv2 == NULL) return 0; else return (similares(arv1->dir, arv2->dir) && similares(arv1->esq, arv2->esq); 9.4 Árvores Binárias Simétricas Duas árvores binárias são simétricas quando uma forma igual á imagem da outra refletida em um espelho. A Árv 1 A Árv 2 B B C D D C E E F F

19 9.5 Árvores para Avaliação de Expressões Nesse tipo de árvore, a raiz identifica o tipo de operador e os filhos identificam os operandos. As árvores binárias são úteis para a avaliação de expressões unárias (com um filho NULL) e binárias. + Raíz / + 6-4 * 5 2 2 3 sobe. Percurso Em Ordem (ERD) 6/5-2+4+2*3 diretamente ((6)/((5)-(2))+((4)+((2)*(3))) inserindo ( quando desce um nível e ) quando Percurso Pós-Ordem (EDR) 652-/423*++ Percurso Pré-Ordem (RED) +/6-52+4*23 9.5 Árvores AND/OR São similares as discutidas anteriormente, mas com os operadores identificados na junção dos ramos da árvore. AND Raíz AND OR 1 1 AND 1 1 0