Uma pilha binária é uma pilha especial. Uma pilha binária é uma árvore binária completa (árvore binária) ou uma árvore binária aproximadamente completa (árvore binária). Existem dois tipos de montes binários: a maior pilha e a menor pilha. Pote máxima: o valor da chave do nó pai é sempre maior ou igual ao valor -chave de qualquer nó filho; Poço mínimo: o valor da chave do nó pai é sempre menor ou igual ao valor da chave de qualquer nó filho.
Imprimir heap binário: Utilize relacionamentos hierárquicos
Aqui, primeiro eu classgo a pilha e, em printAsTree()
Classe pública maxheap <t estende comparável <?? super t >> {private t [] dados; Tamanho privado int; Capacidade privada int; public MaxHeap (int Capacidade) {this.Capacity = Capacidade; this.size = 0; this.data = (t []) nova comparável [capacidade + 1]; } public maxheap (t [] arr) {// heapify, prisioneira de capacidade de heap = arr.length; dados = (t []) nova comparável [capacidade + 1]; System.arraycopy (arr, 0, dados, 1, ar.Length); tamanho = arr.length; for (int i = size / 2; i> = 1; i--) {shiftDown (i); }} public int size () {return this.size; } public int getCapacity () {return this.Capacity; } public boolean isEmpty () {return size == 0; } public t reequeMmax () {retorna dados [1]; } public void swap (int i, int j) {if (i! = j) {t temp = dados [i]; dados [i] = dados [j]; dados [j] = temp; }} public void insert (item t) {size ++; dados [tamanho] = item; shiftUp (tamanho); } public T POPMAX () {SWAP (1, tamanho--); ShiftDown (1); retornar dados [tamanho + 1]; } public void shiftUp (int filho) {while (filho> 1 && data [filho] .compareto (dados [filho / 2])> 0) {swap (criança, criança / 2); criança /= 2; }}/*** @param Uma marca de canto inferior de um elemento na matriz de dados* @param b Marca do canto inferior de um elemento na matriz de dados* @return retorna qual elemento é maior, a marca do canto inferior do qual o elemento é maior*/private int max (int a, int b) {if (Data] .compareto (Data/[b]) <0) {Int] {int b) {if (a]. Dados [a] Big Return a; // retorna a}}/*** @param Uma marca de canto inferior de um elemento na matriz de dados* @param b Marca do canto inferior de um elemento na matriz de dados* @param c A marca do canto inferior de um elemento de um elemento b); maior = max (maior, c); retornar maior; } public void shiftDown (int pai) {while (true) {int lchild = pai * 2; int rchild = pai * 2 + 1; int newfather = pai; // Não importa se a tarefa é atribuída aqui. Se o retorno a seguir for alterado para quebrar, ele deverá ser atribuído se (lchild> size) {// se não houver filhos à esquerda e direita retornar; } else if (rchild> size) {// Se não houver um novo filho da criança = max (pai, lchild); } else {// se houver um novato para crianças esquerda e direita = max (pai, lchild, rchild); } if (newfather == pai) {// Se o nó pai original for o maior de três, você não precisará continuar a resolver o retorno da pilha; } else {// O nó pai não é o maior, troque as crianças mais velhas e continue a ajustar os para baixo até que a pilha de raiz grande seja satisfeita (newfather, pai); Pai = Newfather; // equivalente ao shiftDown (novato). Se o novato acaba sendo o filho esquerdo do pai, é equivalente a shiftdown (2*pai)}}} public static <t estende comparável <?? Super T >> Void Sort (t [] arr) {int len = arr.length; Maxheap <t> maxheap = new maxheap <> (arr); maxheap.printastree (); for (int i = len-1; i> = 0; i--) {arr [i] = maxheap.popmax (); }} public static void printarr (objeto [] arr) {for (objeto o: arr) {System.out.print (O); System.out.print ("/t"); } System.out.println (); } public void printspace (int n) {// Imprima n espaços (usados com '/t' aqui) para (int i = 0; i <n; i ++) {System.out.printf ("%3s", ""); }} public void PrintSastree () {int linenum = 1; // primeiro atravessa a primeira linha int lines = (int) (Math.log (tamanho)/Math.log (2)) + 1; // linhas é o número de camadas do HEAP int espacenum = (int) (Math.Pow (2, linhas) - 1); para (int i = 1; i <= size;) {// porque os dados são armazenados no intervalo fechado esquerdo e direito em [1 ... tamanho], os dados [0] não armazenam dados // cada camada imprime esse intervalo [2^(camada número-1) ... (número 2^da camada) -1]. Se o número na pilha não for suficiente (2^ camadas) -1, imprima para o tamanho. Portanto, pegue min ((2^ camadas) -1, tamanho). for (int j = (int) math.pow (2, linho - 1); j <= math.min (tamanho, (int) math.pow (2, linhum) - 1); j ++) {printspace (espacênico); // Imprime espaços com spacenum System.out.printf ("%3s", dados [j]); // Print Data System.out.printf ("%3s", ""); // Caixa verde no imagens Printspace (espaceno); // Imprima espaços com espacenum i ++; // Cada elemento é impresso, é+1} linho ++; espaceno = espaçador / 2; System.out.println (); }} public static void main (string args []) {Integer [] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6, 1, 3, 6, 1, 1, 1}; classificar (arr); }}Resultados da execução:
Resumir
O exposto acima é todo o conteúdo deste artigo sobre o compartilhamento de código de impressão do idioma Java que implementa montes binários. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!