Informática - Ideia 03

Escrito por Samyra Almeida e Lúcio Figueiredo

Diâmetro de uma Árvore

Diâmetro de uma árvore (também chamado de largura) é a maior das distâncias entre quaisquer dois vértices da árvore. Na imagem abaixo, podemos observar que o diâmetro é igual a 6, sendo igual a distância entre os nós 7 e 11.

Como encontrar o diâmetro de uma árvore

O algoritmo abaixo indica uma maneira de encontrar o diâmetro de um árvore com complexidade O(n).

Algoritmo 1 - Encontrar o Diâmetro de uma árvore:

1. Escolha um nó R arbitrário para ser a raiz da árvore.
2. Encontre o nó V que está mais distante de R
3. Encontre o nó U que está mais distante de V.
4. A distância entre V e U será igual ao diâmetro da árvore.

Prova do Algoritmo 1

Suponha que a árvore está enraizada em um vértice R.

Defina d(x, y) como a distância do vértice x ao vértice y e h(x) como d(R, x). Defina também LCA(x, y) como o menor ancestral comum dos vértices x e y. Por fim, defina D como o diâmetro da árvore.

Seja V o vértice de maior profundidade na árvore, ou seja o vértice mais distante de R. Note que V é o vértice encontrado na etapa 2 do Algoritmo 1. Vamos provar, por absurdo, que V sempre pertence a algum diâmetro.

Suponha, por absurdo, que V não pertence a diâmetro algum. Sejam A e B dois vértices tais que dist(A, B) = D. Defina L como LCA(A, B). Vamos dividir a prova em dois casos:

Caso 1: LCA(V, L) \neq L.

Note que dist(A, B) = (h(A) - h(L)) + (h(B) - h(L)) = h(A) + h(B) - 2 \cdot h(L) = D.

Perceba que h(LCA(V, A)) < h(L). Porém,

dist(V, A) = h(V) + h(A) - 2 \cdot h(LCA(V, A)).

Como h(V) \geq h(B) (por definição) e h(LCA(V, A)) < h(L), chegamos que

dist(V, A) > dist(A, B) \implies dist(V, A) > D, absurdo!

Assim, a prova deste caso está concluída.

Caso 2: LCA(V, L) = L e LCA(V, A) = L.

Note que

dist(V, A) = h(V) + h(A) - 2 \cdot h(L)

e

dist(A, B) = h(A) + h(B) - 2 \cdot h(L).

Como h(V) \geq h(B), obtemos que dist(V, A) \geq dist(A, B) = D. Absurdo, pois assumimos que V não pertence a nenhum diâmetro. Assim, a prova deste caso está concluída.

Caso 3: LCA(V, L) = L e LCA(V, B) = L.

A prova deste caso é análoga à prova do Caso 2.

Como não é possível que LCA(V, L) = L e LCA(V, A) \neq L e LCA(V, B) \neq L, a prova de que V pertence a algum diâmetro está concluída.

Por fim, seja U o vértice mais distante de V (o vértice encontrado na etapa 3 do algoritmo). Seja W um vértice tal que dist(V, W) = D. Como dist(V, U) \geq dist(V, W) = D, conluímos que dist(V, U) = D, e assim, a prova do Algoritmo 1 está finalizada.

[collapse]

Como um exemplo do algoritmo, usaremos a árvore da figura acima. Inicialmente, vamos enraizar a árvore no nó 1.

Depois, vamos procurar (com uma DFS ou BFS, por exemplo) o nó que está mais distante de 1. Podemos perceber que o vértice 11 é o vértice mais distante de 1, com uma distância igual a 4. O próximo passo é encontrar o nó mais distante de 11. Descobrimos que este nó é o 7 com distância 6. Assim, achamos que o diâmetro da árvore é igual a 6.

O código abaixo encontra o diâmetro de uma árvore, utilizando o Algoritmo 1.

Centro de uma Árvore

Em uma árvore qualquer, defina p(x) como a distância do vértice x para o vértice mais distante de x. Este valor é conhecido como excentricidade de x.

O centro de uma árvore é o vértice C tal que o valor p(C) é mínimo, ou seja, o centro de uma árvore é o vértice que possui menor excentricidade. O lema abaixo introduz um fato importante sobre centros:

Lema 1: O centro C de uma árvore pertence a todos os diâmetros presentes nela.

Prova

Enraize a árvore no vértice C.

Sejam U e V duas pontas de um diâmetro qualquer. Vamos realizar uma prova por absurdo, ou seja, vamos supor que C não está no caminho de U para V.

Seja L igual a LCA(U, V). Vamos dividir nossa prova em dois casos:

Caso 1: L = C.

Neste caso, C está no caminho entre U e V por definição, logo, chegamos num absurdo.

Caso 2: L \neq C.

Assuma, sem perda de generalidade, que dist(L, V) \geq dist(L, U). Perceba que V é o vértice na subárvore de L mais distante de L, pois caso contrário, poderíamos trocar um dos vértices U ou V por tal vértice e aumentaríamos o valor do diâmetro da árvore.

Seja W um vértice que não pertence à subárvore de L. Note que dist(L, W) \leq dist(L, U), pois, caso contrário, poderíamos aumentar o valor do diâmetro da árvore.

Note que p(L) é igual a max(d_{dentro}, d_{fora}), onde d_{dentro} é a maior distância entre L e um vértice na subárvore de L e d_{fora} é a maior distância entre L e um vértice fora da subárvore de L.

Perceba que, pelos dois primeiros argumentos acima,

d_{dentro} = dist(L, V) e d_{fora} \leq dist(L, U).

No entanto,

dist(L, V) < dist(C, V) \leq p(C), já que L \neq C.

Analogamente,

dist(L, U) < dist(C, U) \leq p(C).

Portanto, concluímos que ambos os valores d_{dentro} e d_{fora} são estritamente menores que p(C), ou seja, p(L) < p(C), absurdo pela definição de C.

Assim, concluímos a prova do Lema 1.

[collapse]

Como encontrar o centro de uma árvore

O algoritmo abaixo indica uma maneira de encontrar um centro de uma árvore com complexidade O(n):

Algoritmo 2: Encontrar um centro de uma árvore

1. Encontre um diâmetro qualquer com pontas U e V.
2. Encontre o vértice C no caminho de U para V tal que max(dist(C, U), dist(C, V)) possui o menor valor possível.
3. O vértice C é um centro da árvore.

Prova do Algoritmo 2

Suponha, por absurdo, que p(C) \neq max(dist(C, U), dist(C, V)). Então, defina B como o vértice tal que dist(C, B) = p(C). É fácil perceber que B não pertence ao caminho de U para V.

Por definição, dist(C, B) > max(dist(C, U), dist(C, V)). Assim, vamos dividir a prova em dois casos:

Caso 1: dist(U, B) \leq dist(V, B).

Neste caso, perceba que o caminho de V para B não passa por U, pois, caso contrário, dist(V, B) > dist(V, U), absurdo já que dist(V, U) é diâmetro.

Logo,

dist(V, B) = dist(V, C) + dist(C, B).

Como dist(C, B) > dist(C, U), temos que

dist(V, B) = dist(V, C) + dist(C, B) > dist(V, C) + dist(C, U) \implies

\implies dist(V, B) > dist(U, V),

absurdo, já que dist(U, V) é diâmetro.

Caso 2: dist(V, B) < dist(U, B).

A prova deste caso é análoga à prova do Caso 1.

Assim, está concluída a prova do Algoritmo 2.

[collapse]

O código abaixo encontra o centro de uma árvore, utilizando o Algoritmo 2.