Eu estou tentando provar que um montão binária com nodos tem exatamente folhas, dado que o heap é construído da seguinte maneira:
Cada novo nó é inserido via percolate up . Isso significa que cada novo nó deve ser criado no próximo filho disponível. O que quero dizer com isso é que as crianças são preenchidas de nível inferior e da esquerda para a direita. Por exemplo, o seguinte heap:
0
/ \
1 2
teria que ter sido construído nesta ordem: 0, 1, 2. (Os números são apenas índices, eles não dão nenhuma indicação dos dados reais mantidos nesse nó.)
Isso tem duas implicações importantes:
Não pode existir nó no nível sem o nível k estar completamente preenchido
Como os filhos são criados da esquerda para a direita, não pode haver "espaços vazios" entre os nós no nível ou situações como a seguinte:
0 / \ 1 2 / \ \ 3 4 6
(Isso seria um heap ilegal pela minha definição.) Assim, uma boa maneira de pensar nesse heap é uma implementação de array de um heap, onde não pode haver nenhum "salto" nos indeces do array.
Então, eu estava pensando que a indução provavelmente seria uma boa maneira de fazer isso ... Talvez algo que precise lidar com casos ímpares para n. Por exemplo, alguma indução usando o fato de que mesmo pilhas montadas dessa maneira devem ter um nó interno com um filho para um n par e nenhum nó para um n ímpar. Ideias?
fonte
Respostas:
Se eu receber sua pergunta corretamente, o heap obtido é apenas uma árvore binária ordenada, onde, em ordenado, quero dizer que o ésimo nível só pode ser ocupado após o nível k - 1 ter sido completamente preenchido, e cada nível é ocupado da esquerda para a direita, sem pular.k k−1
Então a prova é assim.
fonte
Aqui está uma prova lógica mais simples.
fonte