A inserção de elementos numa árvore ordenada:
| Situação encontrada | Solução a utilizar |
| Árvore vazia | O elemento é introduzido na cabeça da árvore |
| Elemento a inserir é menor | O elemento é introduzido na sub-árvore esquerda |
| Elemento a inserir é maior | O elemento é introduzido na sub-árvore direita |
Implementação prática (função recursiva):
Function inserir(x:elemento;a:arvore):arvore;
if evaz_arv(a) then
inserir:=criar_arv(x,null,null)
else
if x<no(a) then
inserir:=criar_arv(no(a),inserir(x,fe(a)),fd(a))
else
inserir:=criar_arv(no(a),fe(a),inserir(x,fd(a))
end;
evaz_arv(a:arvore):boolean;
(Verifica se a árvore está
vazia ou não)
criar_arv(x:elemento;Fe,Fd:arvore):arvore;
(Cria uma árvore com o elemento
x na cabeça e com Fe e Fd a apontar para sub-árvores)
no(a:arvore):elemento;
(Visita o nó da árvore,
ou seja, devolve o elemento que se encontra no nó)
Implementação
prática (procedimento recursivo):
Procedure inserir(x:elemento;var
a:arvore):arvore;
if evaz_arv(a) then
a<-criar_arv(x,null,null)
else
if x<no(a) then
inserir (x,ponteiro para "filho esquerdo" de "a")
senão
inserir (x,ponteiro para "filho direito" de "a")
end
A eliminação de elementos numa árvore ordenada:
Implementação prática (função recursiva):
Function eliminar
(x:elemento;a:arvore):arvore;
if evaz_arv(a) then
eliminar:=null
else
if no(a)=x then
if evaz_arv(fd(a)) then
eliminar:=fe(a)
else
if evaz(fe(a)) then
eliminar:=fd(a)
else
eliminar:=criar_arv(min(fd(a)),fe(a),eliminar(min(fd(a))),fd(a))
else
if x<no(a) then
eliminar:=criar_arv(no(a),eliminar(x,fe(a),fd(a));
else
eliminar:=criar_arv(no(a),fe(a),eliminar(x,fd(a));
end
Implementação prática (procedimento recursivo):
Procedure eliminar(x:elemento;var
a:arvore):arvore;
if evaz_arv(a) then
a<-null
else
if no(a)=x then
if evaz_arv(fd(a)) then
a:=fe(a)
else
(ponteiro para "nó" de "a"):=min(fd(a))
eliminar:=(min(fd(a)),(ponteiro para "filho direito" de "a")
else
if x<no(a) then
eliminar(x,(ponteiro para "filho esquerdo" de "a"))
else
eliminar(x,(ponteiro para "filho direito" de "a"))
Exemplos:
1 - Exemplo_Eliminação
(utilizando procedimentos)
2 - Exemplo_Inserção
(utilizando procedimentos)
3 - Exemplo_Eliminação
(utilizando procedimentos)
Outros assuntos também referidos na aula:
Função para contar o número de folhas numa árvore:
Funtion conta_folhas
(a:arvore):inteiro;
if evaz_arv(a) then
return 0
else
if fe(a)=null then
if fd(a)=null then
return 1;
else
conta_folhas(fe(a))+conta_folhas(fd(a))
Função para transformar uma lista numa árvore ordenada:
Funtion lista_arv
(l:lista):arvore;
if evaz(l) then
return null
else
inserir(head(l),lista_arv(cauda(l));
Questões:
Helder
Quinzico nº.12090
Joaquim
Rodrigues nº.11775