バイナリヒープは特別なヒープです。バイナリヒープは、完全なバイナリツリー(バイナリツリー)またはほぼ完全なバイナリツリー(バイナリツリー)です。 2種類のバイナリヒープには、最大のヒープと最小ヒープの2種類があります。最大ヒープ:親ノードの重要な値は、常に子ノードのキー値以上です。最小ヒープ:親ノードのキー値は、常に子ノードのキー値以下です。
バイナリヒープを印刷:階層関係を利用します
ここで最初にヒープを並べ替えてから、メソッドを実行して並べ替えてヒープを印刷しますprintAsTree()
パブリッククラスmaxheap <tは比較可能<? Super t >> {private t [] data;プライベートINTサイズ。プライベートINT容量; public Maxheap(int capacity){this.capacity = capuration; this.size = 0; this.data =(t [])new comparable [capacity + 1]; } public maxheap(t [] arr){// heapify、arrayヒープ容量= arr.length; data =(t [])new Camparable [容量 + 1]; System.ArrayCopy(arr、0、data、1、arr.length); size = 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 seekmax(){return data [1]; } public void swap(int i、int j){if(i!= j){t temp = data [i]; data [i] = data [j];データ[j] = temp; }} public void insert(t item){size ++; data [size] = item; Shiftup(size); } public t popmax(){swap(1、size-);シフトダウン(1);データを返す[size + 1]; } public void shiftup(int child){while(child> 1 && data [child] .compareto(data [child / 2])> 0){swap(child、child / 2);子 /= 2; }}/*** @paramデータ配列の要素の下部コーナーマークデータ[a] Big Return a; //返品a}}/*** @paramデータアレイの要素の下部コーナーマーク最大=最大(最大、c);最大の戻り; } public void shiftdown(int father){while(true){int lchild = father * 2; int rchild =父 * 2 + 1; int newfather = father; //割り当てがここに割り当てられているかどうかは関係ありません。次の返品が破損するように変更された場合、(lChild> size){//左および右の子供がない場合は返される場合。 } else if(rchild> size){//正しい子供のnewfather = max(父、lchild); } else {//左と右の子供がいる場合、newfather = max(父、lchild、rchild); } if(newfather == father){//元の親ノードが3つの最大である場合、パイルリターンを整理し続ける必要はありません。 } else {//親ノードは最大ではなく、年長の子供を交換し、大きなルートヒープが満たされるまで下向きに調整し続けます(Newfather、父)。父=ニューファーザー; //シフトダウンに相当(新人)。ニューファーザーが父親の左の子であることが判明した場合、それはシフトダウン(2*父)と同等です(2*父)}}} public static <tは同等の<? 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(object [] arr){for(object o:arr){system.out.print(o); System.out.print( "/t"); } system.out.println(); } public void printspace(int n){// nスペース(代わりに '/t'で使用)for(int i = 0; i <n; i ++){system.out.printf( "%3s"、 ""); }} public void printastree(){int linenum = 1; //最初の行は最初の行をトラバースしますint line =(int)(int)(size(size)/math.log(2)) + 1; // lineはheap int spacenum =(int)(int)(math.pow(2、line)-1)の層の数です。 for(int i = 1; i <= size;){//データは[1 ... size]の左右の閉じた間隔に保存されるため、データはデータを保存しません//各レイヤーはこの間隔を印刷します[2^(レイヤー番号1)...(2^レイヤー番号)-1]。ヒープ内の数字が十分でない場合(2^層)-1、サイズに印刷します。したがって、min((2^ layers)-1、size)を取る。 for(int j =(int)math.pow(2、linenum -1); j <= math.min(size、(int)math.pow(2、linenum)-1); j ++){printspace(spacenum); // spaceNum System.out.printf( "%3s"、data [j])を備えたスペースを印刷します。 //データSystem.out.printfを印刷( "%3s"、 ""); //画像の緑色の箱printspace(spacenum); //空間I ++のあるスペースを印刷します。 //すべての要素が印刷されている、それは+1} linenum ++です。 spaceNum = spaceNum / 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}; sort(arr); }}実行結果:
要約します
上記は、バイナリヒープを実装するJava言語の印刷コード共有に関するこの記事のすべての内容です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!