173
MC-202 Árvores Balanceadas Rafael C. S. Schouery [email protected] Universidade Estadual de Campinas 2º semestre/2019

MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery [email protected] Universidade

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

MC-202Árvores Balanceadas

Rafael C. S. [email protected]

Universidade Estadual de Campinas

2º semestre/2019

Page 2: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Eficiência da busca, inserção e remoçãoQual é o tempo da busca, inserção e remoção em ABBs?

• depende da altura da árvore...

Ex: 31 nós

Melhor árvore: ⌈lg n + 1⌉ Pior árvore: n

Para ter a pior árvore basta inserir em ordem crescente...

Veremos uma árvore balanceada• Não é a melhor árvore possível, mas é “quase”• Operações em O(lg n)

2

Page 3: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Eficiência da busca, inserção e remoçãoQual é o tempo da busca, inserção e remoção em ABBs?

• depende da altura da árvore...

Ex: 31 nós

Melhor árvore: ⌈lg n + 1⌉ Pior árvore: n

Para ter a pior árvore basta inserir em ordem crescente...

Veremos uma árvore balanceada• Não é a melhor árvore possível, mas é “quase”• Operações em O(lg n)

2

Page 4: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Eficiência da busca, inserção e remoçãoQual é o tempo da busca, inserção e remoção em ABBs?

• depende da altura da árvore...

Ex: 31 nós

Melhor árvore: ⌈lg n + 1⌉ Pior árvore: n

Para ter a pior árvore basta inserir em ordem crescente...

Veremos uma árvore balanceada• Não é a melhor árvore possível, mas é “quase”• Operações em O(lg n)

2

Page 5: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Eficiência da busca, inserção e remoçãoQual é o tempo da busca, inserção e remoção em ABBs?

• depende da altura da árvore...

Ex: 31 nós

Melhor árvore: ⌈lg n + 1⌉ Pior árvore: n

Para ter a pior árvore basta inserir em ordem crescente...

Veremos uma árvore balanceada• Não é a melhor árvore possível, mas é “quase”• Operações em O(lg n)

2

Page 6: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Eficiência da busca, inserção e remoçãoQual é o tempo da busca, inserção e remoção em ABBs?

• depende da altura da árvore...

Ex: 31 nós

Melhor árvore: ⌈lg n + 1⌉

Pior árvore: n

Para ter a pior árvore basta inserir em ordem crescente...

Veremos uma árvore balanceada• Não é a melhor árvore possível, mas é “quase”• Operações em O(lg n)

2

Page 7: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Eficiência da busca, inserção e remoçãoQual é o tempo da busca, inserção e remoção em ABBs?

• depende da altura da árvore...

Ex: 31 nós

Melhor árvore: ⌈lg n + 1⌉ Pior árvore: n

Para ter a pior árvore basta inserir em ordem crescente...

Veremos uma árvore balanceada• Não é a melhor árvore possível, mas é “quase”• Operações em O(lg n)

2

Page 8: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Eficiência da busca, inserção e remoçãoQual é o tempo da busca, inserção e remoção em ABBs?

• depende da altura da árvore...

Ex: 31 nós

Melhor árvore: ⌈lg n + 1⌉ Pior árvore: n

Para ter a pior árvore basta inserir em ordem crescente...

Veremos uma árvore balanceada• Não é a melhor árvore possível, mas é “quase”• Operações em O(lg n)

2

Page 9: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Eficiência da busca, inserção e remoçãoQual é o tempo da busca, inserção e remoção em ABBs?

• depende da altura da árvore...

Ex: 31 nós

Melhor árvore: ⌈lg n + 1⌉ Pior árvore: n

Para ter a pior árvore basta inserir em ordem crescente...

Veremos uma árvore balanceada

• Não é a melhor árvore possível, mas é “quase”• Operações em O(lg n)

2

Page 10: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Eficiência da busca, inserção e remoçãoQual é o tempo da busca, inserção e remoção em ABBs?

• depende da altura da árvore...

Ex: 31 nós

Melhor árvore: ⌈lg n + 1⌉ Pior árvore: n

Para ter a pior árvore basta inserir em ordem crescente...

Veremos uma árvore balanceada• Não é a melhor árvore possível, mas é “quase”

• Operações em O(lg n)

2

Page 11: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Eficiência da busca, inserção e remoçãoQual é o tempo da busca, inserção e remoção em ABBs?

• depende da altura da árvore...

Ex: 31 nós

Melhor árvore: ⌈lg n + 1⌉ Pior árvore: n

Para ter a pior árvore basta inserir em ordem crescente...

Veremos uma árvore balanceada• Não é a melhor árvore possível, mas é “quase”• Operações em O(lg n)

2

Page 12: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Árvores Rubro-Negras Esquerdistas26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

Uma árvore rubro-negra esquerdista é uma ABB tal que:1. Todo nó é ou vermelho ou preto2. A raiz é preta3. As folhas são NULL e tem cor preta4. Se um nó é vermelho, seus dois filhos são pretos

– ele é o filho esquerdo do seu pai (por isso, esquerdista)

5. Em cada nó, todo caminho dele para uma de suas folhasdescendentes tem a mesma quantidade de nós pretos

– Não contamos o nó– É a altura-negra do nó

3

Page 13: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Árvores Rubro-Negras Esquerdistas26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

Uma árvore rubro-negra esquerdista é uma ABB tal que:

1. Todo nó é ou vermelho ou preto2. A raiz é preta3. As folhas são NULL e tem cor preta4. Se um nó é vermelho, seus dois filhos são pretos

– ele é o filho esquerdo do seu pai (por isso, esquerdista)

5. Em cada nó, todo caminho dele para uma de suas folhasdescendentes tem a mesma quantidade de nós pretos

– Não contamos o nó– É a altura-negra do nó

3

Page 14: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Árvores Rubro-Negras Esquerdistas

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

Uma árvore rubro-negra esquerdista é uma ABB tal que:1. Todo nó é ou vermelho ou preto

2. A raiz é preta3. As folhas são NULL e tem cor preta4. Se um nó é vermelho, seus dois filhos são pretos

– ele é o filho esquerdo do seu pai (por isso, esquerdista)

5. Em cada nó, todo caminho dele para uma de suas folhasdescendentes tem a mesma quantidade de nós pretos

– Não contamos o nó– É a altura-negra do nó

3

Page 15: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Árvores Rubro-Negras Esquerdistas

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

Uma árvore rubro-negra esquerdista é uma ABB tal que:1. Todo nó é ou vermelho ou preto2. A raiz é preta

3. As folhas são NULL e tem cor preta4. Se um nó é vermelho, seus dois filhos são pretos

– ele é o filho esquerdo do seu pai (por isso, esquerdista)

5. Em cada nó, todo caminho dele para uma de suas folhasdescendentes tem a mesma quantidade de nós pretos

– Não contamos o nó– É a altura-negra do nó

3

Page 16: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Árvores Rubro-Negras Esquerdistas

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

Uma árvore rubro-negra esquerdista é uma ABB tal que:1. Todo nó é ou vermelho ou preto2. A raiz é preta3. As folhas são NULL e tem cor preta

4. Se um nó é vermelho, seus dois filhos são pretos

– ele é o filho esquerdo do seu pai (por isso, esquerdista)

5. Em cada nó, todo caminho dele para uma de suas folhasdescendentes tem a mesma quantidade de nós pretos

– Não contamos o nó– É a altura-negra do nó

3

Page 17: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Árvores Rubro-Negras Esquerdistas

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

Uma árvore rubro-negra esquerdista é uma ABB tal que:1. Todo nó é ou vermelho ou preto2. A raiz é preta3. As folhas são NULL e tem cor preta4. Se um nó é vermelho, seus dois filhos são pretos

– ele é o filho esquerdo do seu pai (por isso, esquerdista)5. Em cada nó, todo caminho dele para uma de suas folhas

descendentes tem a mesma quantidade de nós pretos

– Não contamos o nó– É a altura-negra do nó

3

Page 18: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Árvores Rubro-Negras Esquerdistas

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

Uma árvore rubro-negra esquerdista é uma ABB tal que:1. Todo nó é ou vermelho ou preto2. A raiz é preta3. As folhas são NULL e tem cor preta4. Se um nó é vermelho, seus dois filhos são pretos

– ele é o filho esquerdo do seu pai (por isso, esquerdista)

5. Em cada nó, todo caminho dele para uma de suas folhasdescendentes tem a mesma quantidade de nós pretos

– Não contamos o nó– É a altura-negra do nó

3

Page 19: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Árvores Rubro-Negras Esquerdistas

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

Uma árvore rubro-negra esquerdista é uma ABB tal que:1. Todo nó é ou vermelho ou preto2. A raiz é preta3. As folhas são NULL e tem cor preta4. Se um nó é vermelho, seus dois filhos são pretos

– ele é o filho esquerdo do seu pai (por isso, esquerdista)5. Em cada nó, todo caminho dele para uma de suas folhas

descendentes tem a mesma quantidade de nós pretos

– Não contamos o nó– É a altura-negra do nó

3

Page 20: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Árvores Rubro-Negras Esquerdistas

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

Uma árvore rubro-negra esquerdista é uma ABB tal que:1. Todo nó é ou vermelho ou preto2. A raiz é preta3. As folhas são NULL e tem cor preta4. Se um nó é vermelho, seus dois filhos são pretos

– ele é o filho esquerdo do seu pai (por isso, esquerdista)5. Em cada nó, todo caminho dele para uma de suas folhas

descendentes tem a mesma quantidade de nós pretos– Não contamos o nó

– É a altura-negra do nó

3

Page 21: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Árvores Rubro-Negras Esquerdistas

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

26

17

14

10

7

3

NULL NULL

NULL

12

NULL NULL

16

15

NULL NULL

NULL

21

19

18

NULL NULL

NULL

23

NULL NULL

41

30

28

NULL NULL

38

35

NULL NULL

NULL

47

NULL NULL

Uma árvore rubro-negra esquerdista é uma ABB tal que:1. Todo nó é ou vermelho ou preto2. A raiz é preta3. As folhas são NULL e tem cor preta4. Se um nó é vermelho, seus dois filhos são pretos

– ele é o filho esquerdo do seu pai (por isso, esquerdista)5. Em cada nó, todo caminho dele para uma de suas folhas

descendentes tem a mesma quantidade de nós pretos– Não contamos o nó– É a altura-negra do nó

3

Page 22: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0

– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 23: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0

– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 24: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:

• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0

– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 25: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0

– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 26: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL

– tem exatamente 2bh − 1 = 0 nós não nulos• Se bh > 0

– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 27: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0

– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 28: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0

– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 29: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0– seus filhos têm altura-negra pelo menos bh − 1

– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 30: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos

– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 31: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos

– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 32: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 33: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore

• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 34: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho

• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 35: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1

• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 36: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Altura da Árvore Rubro-Negra EsquerdistaSeja bh a altura-negra da árvore.

A árvore tem pelo menos 2bh − 1 nós não nulos

Para provar, basta utilizar indução matemática:• Se bh = 0

– a árvore é apenas uma folha NULL– tem exatamente 2bh − 1 = 0 nós não nulos

• Se bh > 0– seus filhos têm altura-negra pelo menos bh − 1– cada subárvore tem pelo menos 2bh−1 − 1 nós não nulos– a árvore tem pelo menos 2(2bh−1 − 1) + 1 nós não nulos– ou seja, tem pelo menos 2bh − 1 nós não nulos

A altura-negra bh é pelo menos metade da altura h da árvore• Não existe nó vermelho com filho vermelho• O número de nós não nulos n é n ≥ 2bh − 1 ≥ 2h/2 − 1• Ou seja, h ≤ 2 lg(n + 1) = O(lg n)

4

Page 37: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Alterando a Struct e testando a cor1 enum Cor {VERMELHO, PRETO};23 typedef struct No {4 int chave;5 enum Cor cor;6 struct No *esq, *dir;7 } No;89 typedef No * p_no;

1 int ehVermelho(p_no x) {2 if (x == NULL)3 return 0;4 return x->cor == VERMELHO;5 }

1 int ehPreto(p_no x) {2 if (x == NULL)3 return 1;4 return x->cor == PRETO;5 }

5

Page 38: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Alterando a Struct e testando a cor1 enum Cor {VERMELHO, PRETO};23 typedef struct No {4 int chave;5 enum Cor cor;6 struct No *esq, *dir;7 } No;89 typedef No * p_no;

1 int ehVermelho(p_no x) {2 if (x == NULL)3 return 0;4 return x->cor == VERMELHO;5 }

1 int ehPreto(p_no x) {2 if (x == NULL)3 return 1;4 return x->cor == PRETO;5 }

5

Page 39: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Alterando a Struct e testando a cor1 enum Cor {VERMELHO, PRETO};23 typedef struct No {4 int chave;5 enum Cor cor;6 struct No *esq, *dir;7 } No;89 typedef No * p_no;

1 int ehVermelho(p_no x) {2 if (x == NULL)3 return 0;4 return x->cor == VERMELHO;5 }

1 int ehPreto(p_no x) {2 if (x == NULL)3 return 1;4 return x->cor == PRETO;5 }

5

Page 40: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Rotação para a esquerdaa preto ou vermelho

α x

β γ

xcor original de a

a

α β

γ

1 p_no rotaciona_para_esquerda(p_no raiz) {2 p_no x = raiz->dir;3 raiz->dir = x->esq;4 x->esq = raiz;5 x->cor = raiz->cor;6 raiz->cor = VERMELHO;7 return x;8 }

Note que a rotação:• não estraga a propriedade de busca• não estraga a propriedade da altura negra

6

Page 41: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Rotação para a direitaapreto ou vermelho

x

α β

γ

x cor original de a

α a

β γ

1 p_no rotaciona_para_direita(p_no raiz) {2 p_no x = raiz->esq;3 raiz->esq = x->dir;4 x->dir = raiz;5 x->cor = raiz->cor;6 raiz->cor = VERMELHO;7 return x;8 }

Note que a rotação:• não estraga a propriedade de busca• não estraga a propriedade da altura negra

7

Page 42: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Subindo a cor

a

x

α β

y

γ δ

a

x

α β

y

γ δ

1 void sobe_vermelho(p_no raiz) {2 raiz->cor = VERMELHO;3 raiz->esq->cor = PRETO;4 raiz->dir->cor = PRETO;5 }

Subir a cor não estraga a propriedade da altura negra• mas pode pintar a raiz de vermelho

8

Page 43: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

InserindoInserimos como em uma ABB, mas precisamos manter aspropriedades da árvore rubro-negra esquerdista

1 p_no inserir_rec(p_no raiz, int chave) {2 p_no novo;3 if (raiz == NULL) {4 novo = malloc(sizeof(No));5 novo->esq = novo->dir = NULL;6 novo->chave = chave;7 novo->cor = VERMELHO;8 return novo;9 }

10 if (chave < raiz->chave)11 raiz->esq = inserir_rec(raiz->esq, chave);12 else13 raiz->dir = inserir_rec(raiz->dir, chave);14 /* corrige a árvore */15 return raiz;16 }1718 p_no inserir(p_no raiz, int chave) {19 raiz = inserir_rec(raiz, chave);20 raiz->cor = PRETO;21 return raiz;22 }

9

Page 44: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

InserindoInserimos como em uma ABB, mas precisamos manter aspropriedades da árvore rubro-negra esquerdista

1 p_no inserir_rec(p_no raiz, int chave) {2 p_no novo;3 if (raiz == NULL) {4 novo = malloc(sizeof(No));5 novo->esq = novo->dir = NULL;6 novo->chave = chave;7 novo->cor = VERMELHO;8 return novo;9 }

10 if (chave < raiz->chave)11 raiz->esq = inserir_rec(raiz->esq, chave);12 else13 raiz->dir = inserir_rec(raiz->dir, chave);14 /* corrige a árvore */15 return raiz;16 }1718 p_no inserir(p_no raiz, int chave) {19 raiz = inserir_rec(raiz, chave);20 raiz->cor = PRETO;21 return raiz;22 }

Mantém a raiz preta

9

Page 45: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Corrigindo

• Iremos corrigir cada propriedade

– supomos que as subárvores esquerda e direita já satisfazemtodas propriedade, com exceção da raiz preta

– e corrigimos as propriedades de raiz, uma por vezNão queremos que só o filho direito seja vermelho:

if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))raiz = rotaciona_para_esquerda(raiz);

Nem que um nó vermelho seja filho esquerdo de nó vermelho:if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))

raiz = rotaciona_para_direita(raiz);

Também não queremos que ambos filhos sejam vermelhos:if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))

sobe_vermelho(raiz);

10

Page 46: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Corrigindo

• Iremos corrigir cada propriedade– supomos que as subárvores esquerda e direita já satisfazem

todas propriedade, com exceção da raiz preta

– e corrigimos as propriedades de raiz, uma por vezNão queremos que só o filho direito seja vermelho:

if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))raiz = rotaciona_para_esquerda(raiz);

Nem que um nó vermelho seja filho esquerdo de nó vermelho:if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))

raiz = rotaciona_para_direita(raiz);

Também não queremos que ambos filhos sejam vermelhos:if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))

sobe_vermelho(raiz);

10

Page 47: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Corrigindo

• Iremos corrigir cada propriedade– supomos que as subárvores esquerda e direita já satisfazem

todas propriedade, com exceção da raiz preta– e corrigimos as propriedades de raiz, uma por vez

Não queremos que só o filho direito seja vermelho:if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))

raiz = rotaciona_para_esquerda(raiz);

Nem que um nó vermelho seja filho esquerdo de nó vermelho:if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))

raiz = rotaciona_para_direita(raiz);

Também não queremos que ambos filhos sejam vermelhos:if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))

sobe_vermelho(raiz);

10

Page 48: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Corrigindo

• Iremos corrigir cada propriedade– supomos que as subárvores esquerda e direita já satisfazem

todas propriedade, com exceção da raiz preta– e corrigimos as propriedades de raiz, uma por vez

Não queremos que só o filho direito seja vermelho:

if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))raiz = rotaciona_para_esquerda(raiz);

Nem que um nó vermelho seja filho esquerdo de nó vermelho:if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))

raiz = rotaciona_para_direita(raiz);

Também não queremos que ambos filhos sejam vermelhos:if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))

sobe_vermelho(raiz);

10

Page 49: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Corrigindo

• Iremos corrigir cada propriedade– supomos que as subárvores esquerda e direita já satisfazem

todas propriedade, com exceção da raiz preta– e corrigimos as propriedades de raiz, uma por vez

Não queremos que só o filho direito seja vermelho:if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))

raiz = rotaciona_para_esquerda(raiz);

Nem que um nó vermelho seja filho esquerdo de nó vermelho:if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))

raiz = rotaciona_para_direita(raiz);

Também não queremos que ambos filhos sejam vermelhos:if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))

sobe_vermelho(raiz);

10

Page 50: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Corrigindo

• Iremos corrigir cada propriedade– supomos que as subárvores esquerda e direita já satisfazem

todas propriedade, com exceção da raiz preta– e corrigimos as propriedades de raiz, uma por vez

Não queremos que só o filho direito seja vermelho:if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))

raiz = rotaciona_para_esquerda(raiz);

Nem que um nó vermelho seja filho esquerdo de nó vermelho:

if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))raiz = rotaciona_para_direita(raiz);

Também não queremos que ambos filhos sejam vermelhos:if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))

sobe_vermelho(raiz);

10

Page 51: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Corrigindo

• Iremos corrigir cada propriedade– supomos que as subárvores esquerda e direita já satisfazem

todas propriedade, com exceção da raiz preta– e corrigimos as propriedades de raiz, uma por vez

Não queremos que só o filho direito seja vermelho:if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))

raiz = rotaciona_para_esquerda(raiz);

Nem que um nó vermelho seja filho esquerdo de nó vermelho:if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))

raiz = rotaciona_para_direita(raiz);

Também não queremos que ambos filhos sejam vermelhos:if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))

sobe_vermelho(raiz);

10

Page 52: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Corrigindo

• Iremos corrigir cada propriedade– supomos que as subárvores esquerda e direita já satisfazem

todas propriedade, com exceção da raiz preta– e corrigimos as propriedades de raiz, uma por vez

Não queremos que só o filho direito seja vermelho:if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))

raiz = rotaciona_para_esquerda(raiz);

Nem que um nó vermelho seja filho esquerdo de nó vermelho:if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))

raiz = rotaciona_para_direita(raiz);

Também não queremos que ambos filhos sejam vermelhos:

if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))sobe_vermelho(raiz);

10

Page 53: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Corrigindo

• Iremos corrigir cada propriedade– supomos que as subárvores esquerda e direita já satisfazem

todas propriedade, com exceção da raiz preta– e corrigimos as propriedades de raiz, uma por vez

Não queremos que só o filho direito seja vermelho:if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))

raiz = rotaciona_para_esquerda(raiz);

Nem que um nó vermelho seja filho esquerdo de nó vermelho:if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))

raiz = rotaciona_para_direita(raiz);

Também não queremos que ambos filhos sejam vermelhos:if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))

sobe_vermelho(raiz);

10

Page 54: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 1

• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho direito é preto (tem que ser - por que?)• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

11

Page 55: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 1• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho direito é preto (tem que ser - por que?)• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

11

Page 56: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 1• Nó atual é preto

– não sabemos a cor do seu pai

– nem se ele é o filho esquerdo ou direito• Filho direito é preto (tem que ser - por que?)• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

11

Page 57: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 1• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho direito é preto (tem que ser - por que?)• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

11

Page 58: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 1• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho direito é preto (tem que ser - por que?)

• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

11

Page 59: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 1• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho direito é preto (tem que ser - por que?)• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

11

Page 60: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 1• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho direito é preto (tem que ser - por que?)• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

11

Page 61: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 1• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho direito é preto (tem que ser - por que?)• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

11

Page 62: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 1• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho direito é preto (tem que ser - por que?)• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

11

Page 63: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 1• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho direito é preto (tem que ser - por que?)• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

11

Page 64: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 1• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho direito é preto (tem que ser - por que?)• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

11

Page 65: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 1• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho direito é preto (tem que ser - por que?)• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

11

Page 66: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 1• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho direito é preto (tem que ser - por que?)• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

11

Page 67: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 2

• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é preto• Inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

12

Page 68: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 2• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é preto• Inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

12

Page 69: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 2• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é preto

• Inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

12

Page 70: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 2• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é preto• Inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

12

Page 71: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 2• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é preto• Inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

12

Page 72: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 2• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é preto• Inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

12

Page 73: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 2• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é preto• Inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

12

Page 74: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 2• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é preto• Inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

12

Page 75: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 2• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é preto• Inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

12

Page 76: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 2• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é preto• Inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

12

Page 77: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 2• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é preto• Inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

12

Page 78: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 2• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é preto• Inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

12

Page 79: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 3

• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é vermelho• Inserimos no filho direito

NULL

inserção

NULL NULL

sobe o vermelho

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

13

Page 80: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 3• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é vermelho• Inserimos no filho direito

NULL

inserção

NULL NULL

sobe o vermelho

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

13

Page 81: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 3• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é vermelho

• Inserimos no filho direito

NULL

inserção

NULL NULL

sobe o vermelho

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

13

Page 82: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 3• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é vermelho• Inserimos no filho direito

NULL

inserção

NULL NULL

sobe o vermelho

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

13

Page 83: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 3• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é vermelho• Inserimos no filho direito

NULL

inserção

NULL NULL

sobe o vermelho

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

13

Page 84: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 3• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é vermelho• Inserimos no filho direito

NULL

inserção

NULL NULL

sobe o vermelho

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

13

Page 85: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 3• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é vermelho• Inserimos no filho direito

NULL

inserção

NULL NULL

sobe o vermelho

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

13

Page 86: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 3• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é vermelho• Inserimos no filho direito

NULL

inserção

NULL NULL

sobe o vermelho

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

13

Page 87: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 3• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é vermelho• Inserimos no filho direito

NULL

inserção

NULL NULL

sobe o vermelho

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

13

Page 88: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 3• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é vermelho• Inserimos no filho direito

NULL

inserção

NULL NULL

sobe o vermelho

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

13

Page 89: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 3• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é vermelho• Inserimos no filho direito

NULL

inserção

NULL NULL

sobe o vermelho

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

13

Page 90: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 3• Nó atual é preto

– não sabemos a cor do seu pai– nem se ele é o filho esquerdo ou direito

• Filho esquerdo é vermelho• Inserimos no filho direito

NULL

inserção

NULL NULL

sobe o vermelho

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

13

Page 91: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 4

• Nó atual é vermelho

– seu pai é preto (ele não é a raiz - por que?)– é o filho esquerdo (por que?)

• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

14

Page 92: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 4• Nó atual é vermelho

– seu pai é preto (ele não é a raiz - por que?)– é o filho esquerdo (por que?)

• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

14

Page 93: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 4• Nó atual é vermelho

– seu pai é preto (ele não é a raiz - por que?)

– é o filho esquerdo (por que?)• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

14

Page 94: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 4• Nó atual é vermelho

– seu pai é preto (ele não é a raiz - por que?)– é o filho esquerdo (por que?)

• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

14

Page 95: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 4• Nó atual é vermelho

– seu pai é preto (ele não é a raiz - por que?)– é o filho esquerdo (por que?)

• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

14

Page 96: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 4• Nó atual é vermelho

– seu pai é preto (ele não é a raiz - por que?)– é o filho esquerdo (por que?)

• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

14

Page 97: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 4• Nó atual é vermelho

– seu pai é preto (ele não é a raiz - por que?)– é o filho esquerdo (por que?)

• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

14

Page 98: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 4• Nó atual é vermelho

– seu pai é preto (ele não é a raiz - por que?)– é o filho esquerdo (por que?)

• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

14

Page 99: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 4• Nó atual é vermelho

– seu pai é preto (ele não é a raiz - por que?)– é o filho esquerdo (por que?)

• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

14

Page 100: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 4• Nó atual é vermelho

– seu pai é preto (ele não é a raiz - por que?)– é o filho esquerdo (por que?)

• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

14

Page 101: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 4• Nó atual é vermelho

– seu pai é preto (ele não é a raiz - por que?)– é o filho esquerdo (por que?)

• Inserimos no filho esquerdo

NULL

inserção

NULL NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

14

Page 102: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 5

• Nó atual é vermelho

– seu pai é preto (ele não é a raiz)– é o filho esquerdo

• inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

15

Page 103: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 5• Nó atual é vermelho

– seu pai é preto (ele não é a raiz)– é o filho esquerdo

• inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

15

Page 104: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 5• Nó atual é vermelho

– seu pai é preto (ele não é a raiz)– é o filho esquerdo

• inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

15

Page 105: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 5• Nó atual é vermelho

– seu pai é preto (ele não é a raiz)– é o filho esquerdo

• inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

15

Page 106: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 5• Nó atual é vermelho

– seu pai é preto (ele não é a raiz)– é o filho esquerdo

• inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

15

Page 107: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 5• Nó atual é vermelho

– seu pai é preto (ele não é a raiz)– é o filho esquerdo

• inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

15

Page 108: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 5• Nó atual é vermelho

– seu pai é preto (ele não é a raiz)– é o filho esquerdo

• inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

15

Page 109: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 5• Nó atual é vermelho

– seu pai é preto (ele não é a raiz)– é o filho esquerdo

• inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

15

Page 110: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 5• Nó atual é vermelho

– seu pai é preto (ele não é a raiz)– é o filho esquerdo

• inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

15

Page 111: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 5• Nó atual é vermelho

– seu pai é preto (ele não é a raiz)– é o filho esquerdo

• inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

15

Page 112: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Caso 5• Nó atual é vermelho

– seu pai é preto (ele não é a raiz)– é o filho esquerdo

• inserimos no filho direito

NULL

inserção

NULL NULL

rotação

NULL

NULL

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

15

Page 113: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no pai

Quais problemas sobraram para o pai resolver?• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for preto, basta rotacionar para a esquerda

rotação

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

16

Page 114: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for preto, basta rotacionar para a esquerda

rotação

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

16

Page 115: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)

• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for preto, basta rotacionar para a esquerda

rotação

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

16

Page 116: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for preto, basta rotacionar para a esquerda

rotação

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

16

Page 117: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for preto, basta rotacionar para a esquerda

rotação

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

16

Page 118: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for preto, basta rotacionar para a esquerda

rotação

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

16

Page 119: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for preto, basta rotacionar para a esquerda

rotação

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

16

Page 120: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for preto, basta rotacionar para a esquerda

rotação

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

16

Page 121: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for preto, basta rotacionar para a esquerda

rotação

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

16

Page 122: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for preto, basta rotacionar para a esquerda

rotação

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

16

Page 123: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for preto, basta rotacionar para a esquerda

rotação

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

16

Page 124: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for vermelho, basta subir a cor

sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

17

Page 125: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for vermelho, basta subir a cor

sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

17

Page 126: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for vermelho, basta subir a cor

sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

17

Page 127: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for vermelho, basta subir a cor

sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

17

Page 128: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for vermelho, basta subir a cor

sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

17

Page 129: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for vermelho, basta subir a cor

sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

17

Page 130: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for vermelho, basta subir a cor

sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

17

Page 131: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho direito seja vermelho (não é esquerdista)• Só pode ter acontecido porque a cor vermelha subiu

Se o filho esquerdo for vermelho, basta subir a cor

sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

17

Page 132: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho esquerdo seja vermelho• E o neto mais a esquerda seja vermelho

rotação sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

18

Page 133: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho esquerdo seja vermelho

• E o neto mais a esquerda seja vermelho

rotação sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

18

Page 134: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho esquerdo seja vermelho• E o neto mais a esquerda seja vermelho

rotação sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

18

Page 135: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho esquerdo seja vermelho• E o neto mais a esquerda seja vermelho

rotação sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

18

Page 136: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho esquerdo seja vermelho• E o neto mais a esquerda seja vermelho

rotação sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

18

Page 137: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho esquerdo seja vermelho• E o neto mais a esquerda seja vermelho

rotação sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

18

Page 138: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho esquerdo seja vermelho• E o neto mais a esquerda seja vermelho

rotação sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

18

Page 139: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho esquerdo seja vermelho• E o neto mais a esquerda seja vermelho

rotação

sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

18

Page 140: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho esquerdo seja vermelho• E o neto mais a esquerda seja vermelho

rotação

sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

18

Page 141: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho esquerdo seja vermelho• E o neto mais a esquerda seja vermelho

rotação

sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

18

Page 142: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Resolvendo problemas no paiQuais problemas sobraram para o pai resolver?

• Talvez o filho esquerdo seja vermelho• E o neto mais a esquerda seja vermelho

rotação sobe o vermelho

1 /* corrige a árvore */2 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))3 raiz = rotaciona_para_esquerda(raiz);4 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))5 raiz = rotaciona_para_direita(raiz);6 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))7 sobe_vermelho(raiz);

18

Page 143: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Implementação

1 p_no inserir_rec(p_no raiz, int chave) {2 p_no novo;3 if (raiz == NULL) {4 novo = malloc(sizeof(No));5 novo->esq = novo->dir = NULL;6 novo->chave = chave;7 novo->cor = VERMELHO;8 return novo;9 }

10 if (chave < raiz->chave)11 raiz->esq = inserir_rec(raiz->esq, chave);12 else13 raiz->dir = inserir_rec(raiz->dir, chave);14 /* corrige a árvore */15 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))16 raiz = rotaciona_para_esquerda(raiz);17 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))18 raiz = rotaciona_para_direita(raiz);19 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))20 sobe_vermelho(raiz);21 return raiz;22 }

19

Page 144: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Inserção - Implementação1 p_no inserir_rec(p_no raiz, int chave) {2 p_no novo;3 if (raiz == NULL) {4 novo = malloc(sizeof(No));5 novo->esq = novo->dir = NULL;6 novo->chave = chave;7 novo->cor = VERMELHO;8 return novo;9 }

10 if (chave < raiz->chave)11 raiz->esq = inserir_rec(raiz->esq, chave);12 else13 raiz->dir = inserir_rec(raiz->dir, chave);14 /* corrige a árvore */15 if (ehVermelho(raiz->dir) && ehPreto(raiz->esq))16 raiz = rotaciona_para_esquerda(raiz);17 if (ehVermelho(raiz->esq) && ehVermelho(raiz->esq->esq))18 raiz = rotaciona_para_direita(raiz);19 if (ehVermelho(raiz->esq) && ehVermelho(raiz->dir))20 sobe_vermelho(raiz);21 return raiz;22 }

19

Page 145: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Remoção

É possível fazer remoções em árvores rubro-negras

• Mas não veremos aqui...

A ideia é basicamente a mesma:• encontrar operações que corrijam a árvore• operações locais que mantêm as propriedades globais

Sugestão de leitura:• Sedgewick e Wayne, Algorithms, 4th Edition, Addison-Wesley

Professional, 2011.• Cormen, Leiserson, Rivest e Stein, Introduction to Algorithms,

Third Edition, MIT Press, 2009.

20

Page 146: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Remoção

É possível fazer remoções em árvores rubro-negras• Mas não veremos aqui...

A ideia é basicamente a mesma:• encontrar operações que corrijam a árvore• operações locais que mantêm as propriedades globais

Sugestão de leitura:• Sedgewick e Wayne, Algorithms, 4th Edition, Addison-Wesley

Professional, 2011.• Cormen, Leiserson, Rivest e Stein, Introduction to Algorithms,

Third Edition, MIT Press, 2009.

20

Page 147: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Remoção

É possível fazer remoções em árvores rubro-negras• Mas não veremos aqui...

A ideia é basicamente a mesma:

• encontrar operações que corrijam a árvore• operações locais que mantêm as propriedades globais

Sugestão de leitura:• Sedgewick e Wayne, Algorithms, 4th Edition, Addison-Wesley

Professional, 2011.• Cormen, Leiserson, Rivest e Stein, Introduction to Algorithms,

Third Edition, MIT Press, 2009.

20

Page 148: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Remoção

É possível fazer remoções em árvores rubro-negras• Mas não veremos aqui...

A ideia é basicamente a mesma:• encontrar operações que corrijam a árvore

• operações locais que mantêm as propriedades globais

Sugestão de leitura:• Sedgewick e Wayne, Algorithms, 4th Edition, Addison-Wesley

Professional, 2011.• Cormen, Leiserson, Rivest e Stein, Introduction to Algorithms,

Third Edition, MIT Press, 2009.

20

Page 149: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Remoção

É possível fazer remoções em árvores rubro-negras• Mas não veremos aqui...

A ideia é basicamente a mesma:• encontrar operações que corrijam a árvore• operações locais que mantêm as propriedades globais

Sugestão de leitura:• Sedgewick e Wayne, Algorithms, 4th Edition, Addison-Wesley

Professional, 2011.• Cormen, Leiserson, Rivest e Stein, Introduction to Algorithms,

Third Edition, MIT Press, 2009.

20

Page 150: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Remoção

É possível fazer remoções em árvores rubro-negras• Mas não veremos aqui...

A ideia é basicamente a mesma:• encontrar operações que corrijam a árvore• operações locais que mantêm as propriedades globais

Sugestão de leitura:

• Sedgewick e Wayne, Algorithms, 4th Edition, Addison-WesleyProfessional, 2011.

• Cormen, Leiserson, Rivest e Stein, Introduction to Algorithms,Third Edition, MIT Press, 2009.

20

Page 151: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Remoção

É possível fazer remoções em árvores rubro-negras• Mas não veremos aqui...

A ideia é basicamente a mesma:• encontrar operações que corrijam a árvore• operações locais que mantêm as propriedades globais

Sugestão de leitura:• Sedgewick e Wayne, Algorithms, 4th Edition, Addison-Wesley

Professional, 2011.

• Cormen, Leiserson, Rivest e Stein, Introduction to Algorithms,Third Edition, MIT Press, 2009.

20

Page 152: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Remoção

É possível fazer remoções em árvores rubro-negras• Mas não veremos aqui...

A ideia é basicamente a mesma:• encontrar operações que corrijam a árvore• operações locais que mantêm as propriedades globais

Sugestão de leitura:• Sedgewick e Wayne, Algorithms, 4th Edition, Addison-Wesley

Professional, 2011.• Cormen, Leiserson, Rivest e Stein, Introduction to Algorithms,

Third Edition, MIT Press, 2009.

20

Page 153: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Rubro-Negras - Conclusão

As árvores rubro-negras esquerdistas suportam as seguintesoperações:

• Busca• Inserção• Remoção

todas em tempo O(lg n)

É uma variante da árvore rubro-negra com menos operações paracorrigir a árvore na inserção e na remoção

Árvores rubro-negras são usadas como a árvore padrão no C++,no JAVA e no kernel do Linux

21

Page 154: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Rubro-Negras - Conclusão

As árvores rubro-negras esquerdistas suportam as seguintesoperações:

• Busca

• Inserção• Remoção

todas em tempo O(lg n)

É uma variante da árvore rubro-negra com menos operações paracorrigir a árvore na inserção e na remoção

Árvores rubro-negras são usadas como a árvore padrão no C++,no JAVA e no kernel do Linux

21

Page 155: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Rubro-Negras - Conclusão

As árvores rubro-negras esquerdistas suportam as seguintesoperações:

• Busca• Inserção

• Remoçãotodas em tempo O(lg n)

É uma variante da árvore rubro-negra com menos operações paracorrigir a árvore na inserção e na remoção

Árvores rubro-negras são usadas como a árvore padrão no C++,no JAVA e no kernel do Linux

21

Page 156: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Rubro-Negras - Conclusão

As árvores rubro-negras esquerdistas suportam as seguintesoperações:

• Busca• Inserção• Remoção

todas em tempo O(lg n)

É uma variante da árvore rubro-negra com menos operações paracorrigir a árvore na inserção e na remoção

Árvores rubro-negras são usadas como a árvore padrão no C++,no JAVA e no kernel do Linux

21

Page 157: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Rubro-Negras - Conclusão

As árvores rubro-negras esquerdistas suportam as seguintesoperações:

• Busca• Inserção• Remoção

todas em tempo O(lg n)

É uma variante da árvore rubro-negra com menos operações paracorrigir a árvore na inserção e na remoção

Árvores rubro-negras são usadas como a árvore padrão no C++,no JAVA e no kernel do Linux

21

Page 158: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Rubro-Negras - Conclusão

As árvores rubro-negras esquerdistas suportam as seguintesoperações:

• Busca• Inserção• Remoção

todas em tempo O(lg n)

É uma variante da árvore rubro-negra com menos operações paracorrigir a árvore na inserção e na remoção

Árvores rubro-negras são usadas como a árvore padrão no C++,no JAVA e no kernel do Linux

21

Page 159: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Rubro-Negras - Conclusão

As árvores rubro-negras esquerdistas suportam as seguintesoperações:

• Busca• Inserção• Remoção

todas em tempo O(lg n)

É uma variante da árvore rubro-negra com menos operações paracorrigir a árvore na inserção e na remoção

Árvores rubro-negras são usadas como a árvore padrão no C++,no JAVA e no kernel do Linux

21

Page 160: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:• A altura das subárvores pode variar de no máximo 1• Tem altura O(lg n)

ABB aleatorizada:• Decide de maneira aleatória como inserir o nó

– inserção normal como folha– inserção na raiz - rotações trazem o nó até a raiz

• Altura “média” (esperada): O(lg n)

Árvores Splay:• Sobe os nós no caminho da busca/inserção• Nós mais acessados ficam mais próximos da raiz• Não é balanceada, mas o custo de m inserções/buscas em

uma árvore Splay com n nós é O((n + m) lg(n + m))

22

Page 161: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:• A altura das subárvores pode variar de no máximo 1• Tem altura O(lg n)

ABB aleatorizada:• Decide de maneira aleatória como inserir o nó

– inserção normal como folha– inserção na raiz - rotações trazem o nó até a raiz

• Altura “média” (esperada): O(lg n)

Árvores Splay:• Sobe os nós no caminho da busca/inserção• Nós mais acessados ficam mais próximos da raiz• Não é balanceada, mas o custo de m inserções/buscas em

uma árvore Splay com n nós é O((n + m) lg(n + m))

22

Page 162: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:

• A altura das subárvores pode variar de no máximo 1• Tem altura O(lg n)

ABB aleatorizada:• Decide de maneira aleatória como inserir o nó

– inserção normal como folha– inserção na raiz - rotações trazem o nó até a raiz

• Altura “média” (esperada): O(lg n)

Árvores Splay:• Sobe os nós no caminho da busca/inserção• Nós mais acessados ficam mais próximos da raiz• Não é balanceada, mas o custo de m inserções/buscas em

uma árvore Splay com n nós é O((n + m) lg(n + m))

22

Page 163: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:• A altura das subárvores pode variar de no máximo 1

• Tem altura O(lg n)

ABB aleatorizada:• Decide de maneira aleatória como inserir o nó

– inserção normal como folha– inserção na raiz - rotações trazem o nó até a raiz

• Altura “média” (esperada): O(lg n)

Árvores Splay:• Sobe os nós no caminho da busca/inserção• Nós mais acessados ficam mais próximos da raiz• Não é balanceada, mas o custo de m inserções/buscas em

uma árvore Splay com n nós é O((n + m) lg(n + m))

22

Page 164: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:• A altura das subárvores pode variar de no máximo 1• Tem altura O(lg n)

ABB aleatorizada:• Decide de maneira aleatória como inserir o nó

– inserção normal como folha– inserção na raiz - rotações trazem o nó até a raiz

• Altura “média” (esperada): O(lg n)

Árvores Splay:• Sobe os nós no caminho da busca/inserção• Nós mais acessados ficam mais próximos da raiz• Não é balanceada, mas o custo de m inserções/buscas em

uma árvore Splay com n nós é O((n + m) lg(n + m))

22

Page 165: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:• A altura das subárvores pode variar de no máximo 1• Tem altura O(lg n)

ABB aleatorizada:

• Decide de maneira aleatória como inserir o nó

– inserção normal como folha– inserção na raiz - rotações trazem o nó até a raiz

• Altura “média” (esperada): O(lg n)

Árvores Splay:• Sobe os nós no caminho da busca/inserção• Nós mais acessados ficam mais próximos da raiz• Não é balanceada, mas o custo de m inserções/buscas em

uma árvore Splay com n nós é O((n + m) lg(n + m))

22

Page 166: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:• A altura das subárvores pode variar de no máximo 1• Tem altura O(lg n)

ABB aleatorizada:• Decide de maneira aleatória como inserir o nó

– inserção normal como folha– inserção na raiz - rotações trazem o nó até a raiz

• Altura “média” (esperada): O(lg n)

Árvores Splay:• Sobe os nós no caminho da busca/inserção• Nós mais acessados ficam mais próximos da raiz• Não é balanceada, mas o custo de m inserções/buscas em

uma árvore Splay com n nós é O((n + m) lg(n + m))

22

Page 167: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:• A altura das subárvores pode variar de no máximo 1• Tem altura O(lg n)

ABB aleatorizada:• Decide de maneira aleatória como inserir o nó

– inserção normal como folha

– inserção na raiz - rotações trazem o nó até a raiz• Altura “média” (esperada): O(lg n)

Árvores Splay:• Sobe os nós no caminho da busca/inserção• Nós mais acessados ficam mais próximos da raiz• Não é balanceada, mas o custo de m inserções/buscas em

uma árvore Splay com n nós é O((n + m) lg(n + m))

22

Page 168: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:• A altura das subárvores pode variar de no máximo 1• Tem altura O(lg n)

ABB aleatorizada:• Decide de maneira aleatória como inserir o nó

– inserção normal como folha– inserção na raiz - rotações trazem o nó até a raiz

• Altura “média” (esperada): O(lg n)

Árvores Splay:• Sobe os nós no caminho da busca/inserção• Nós mais acessados ficam mais próximos da raiz• Não é balanceada, mas o custo de m inserções/buscas em

uma árvore Splay com n nós é O((n + m) lg(n + m))

22

Page 169: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:• A altura das subárvores pode variar de no máximo 1• Tem altura O(lg n)

ABB aleatorizada:• Decide de maneira aleatória como inserir o nó

– inserção normal como folha– inserção na raiz - rotações trazem o nó até a raiz

• Altura “média” (esperada): O(lg n)

Árvores Splay:• Sobe os nós no caminho da busca/inserção• Nós mais acessados ficam mais próximos da raiz• Não é balanceada, mas o custo de m inserções/buscas em

uma árvore Splay com n nós é O((n + m) lg(n + m))

22

Page 170: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:• A altura das subárvores pode variar de no máximo 1• Tem altura O(lg n)

ABB aleatorizada:• Decide de maneira aleatória como inserir o nó

– inserção normal como folha– inserção na raiz - rotações trazem o nó até a raiz

• Altura “média” (esperada): O(lg n)

Árvores Splay:

• Sobe os nós no caminho da busca/inserção• Nós mais acessados ficam mais próximos da raiz• Não é balanceada, mas o custo de m inserções/buscas em

uma árvore Splay com n nós é O((n + m) lg(n + m))

22

Page 171: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:• A altura das subárvores pode variar de no máximo 1• Tem altura O(lg n)

ABB aleatorizada:• Decide de maneira aleatória como inserir o nó

– inserção normal como folha– inserção na raiz - rotações trazem o nó até a raiz

• Altura “média” (esperada): O(lg n)

Árvores Splay:• Sobe os nós no caminho da busca/inserção

• Nós mais acessados ficam mais próximos da raiz• Não é balanceada, mas o custo de m inserções/buscas em

uma árvore Splay com n nós é O((n + m) lg(n + m))

22

Page 172: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:• A altura das subárvores pode variar de no máximo 1• Tem altura O(lg n)

ABB aleatorizada:• Decide de maneira aleatória como inserir o nó

– inserção normal como folha– inserção na raiz - rotações trazem o nó até a raiz

• Altura “média” (esperada): O(lg n)

Árvores Splay:• Sobe os nós no caminho da busca/inserção• Nós mais acessados ficam mais próximos da raiz

• Não é balanceada, mas o custo de m inserções/buscas emuma árvore Splay com n nós é O((n + m) lg(n + m))

22

Page 173: MC-202 Árvores Balanceadas - Instituto de Computaçãorafael/cursos/2s2019/mc202/... · 2019-10-17 · MC-202 Árvores Balanceadas Rafael C. S. Schouery rafael@ic.unicamp.br Universidade

Outras árvores balanceadasExistem também outras ABBs balanceadas:

• Uma árvore balanceada é uma árvore com altura O(lg n)

Árvores AVL:• A altura das subárvores pode variar de no máximo 1• Tem altura O(lg n)

ABB aleatorizada:• Decide de maneira aleatória como inserir o nó

– inserção normal como folha– inserção na raiz - rotações trazem o nó até a raiz

• Altura “média” (esperada): O(lg n)

Árvores Splay:• Sobe os nós no caminho da busca/inserção• Nós mais acessados ficam mais próximos da raiz• Não é balanceada, mas o custo de m inserções/buscas em

uma árvore Splay com n nós é O((n + m) lg(n + m))22