كومة ثنائية هي كومة خاصة. كومة ثنائية هي شجرة ثنائية كاملة (شجرة ثنائية) أو شجرة ثنائية كاملة تقريبًا (شجرة ثنائية). هناك نوعان من النواة الثنائية: أكبر كومة وأصغر كومة. الحد الأقصى للكومة: تكون القيمة الرئيسية للعقدة الأصل دائمًا أكبر من أو تساوي القيمة الرئيسية لأي عقدة طفل ؛ الحد الأدنى للكومة: القيمة الرئيسية للعقدة الأصل تكون دائمًا أقل من أو تساوي القيمة الرئيسية لأي عقدة طفل.
طباعة الكومة الثنائية: استخدم العلاقات الهرمية
هنا أقوم أولاً بفرز الكومة ، ثم قم بتنفيذ طريقة طباعة الكومة في فرز printAsTree()
الطبقة العامة maxheap <t يمتد قابلة للمقارنة <؟ Super t >> {private t [] data ؛ حجم الباحث الخاص ؛ سعة int الخاصة ؛ maxheap العام (السعة int) {this.capacity = cappy ؛ this.size = 0 ؛ this.data = (t []) جديد قابلة للمقارنة [السعة + 1] ؛ } MaxHeap العام (t [] arr) {// Heapify ، capty heap artry = arr.length ؛ البيانات = (t []) جديد قابلة للمقارنة [السعة + 1] ؛ System.ArrayCopy (ARR ، 0 ، Data ، 1 ، Arr.Length) ؛ الحجم = arr.length ؛ لـ (int i = size / 2 ؛ i> = 1 ؛ i--) {shiftDown (i) ؛ }} public int size () {return this.size ؛ } public int getCapacity () {return this.capacity ؛ } boolean public isempty () {return size == 0 ؛ } public t seekmax () {return data [1] ؛ } مبادلة void العامة (int i ، int j) {if (i! = j) {t temp = data [i] ؛ البيانات [i] = البيانات [j] ؛ البيانات [j] = temp ؛ }} public void insert (t item) {size ++ ؛ البيانات [الحجم] = العنصر ؛ Shiftup (الحجم) ؛ } popmax popmax () {swap (1 ، size--) ؛ ShiftDown (1) ؛ إرجاع البيانات [الحجم + 1] ؛ } public void shiftup (int child) {بينما (child> 1 && data [child] .Compareto (data [child / 2])> 0) {swap (child ، child / 2) ؛ الطفل /= 2 ؛ }}/*** param علامة زاوية منخفضة لعنصر في صفيف البيانات* param b علامة زاوية منخفضة لعنصر في صفيف البيانات* return return أي عنصر أكبر ، علامة الزاوية السفلية التي يكون العنصر أكبر*/private int max (int a ، int b) {if (data [a] .Compareto (data [b]) <0) البيانات [A] عودة كبيرة A ؛ // إرجاع A}}/*** param علامة زاوية منخفضة لعنصر في صفيف البيانات* param b علامة الزاوية السفلية لعنصر في صفيف البيانات* param c علامة الزاوية السفلية لعنصر في مجموعة البيانات* @العلامة السفلية لعنصر أكبر*/private int max (int b ، int c) الأكبر = الحد الأقصى (الأكبر ، ج) ؛ العودة الأكبر ؛ } public void shiftDown (int ald) {بينما (صحيح) {int lchild = الأب * 2 ؛ int rchild = الأب * 2 + 1 ؛ int newFather = الأب ؛ // لا يهم ما إذا تم تعيين المهمة هنا. إذا تم تغيير العائد التالي لكسر ، فيجب تعيينه إذا كان (LCHILD> SIZE) {// إذا لم يكن هناك أطفال يسار واليمين ؛ } آخر إذا (rchild> size) {// إذا لم يكن هناك طفل جديد جديد = max (الأب ، lchild) ؛ } آخر {// إذا كان هناك أطفال يسار واليمين } إذا (newFather == الأب) {// إذا كانت العقدة الأصل الأصلية هي الأكبر من ثلاثة ، فلن تحتاج إلى متابعة عودة الوبر ؛ } آخر {// العقدة الأصل ليست الأكبر ، تبديل الأطفال الأكبر سناً وتستمر في ضبط الأسفل حتى يتم استوفاء كومة الجذر الكبيرة (NewFather ، الأب) ؛ الأب = newFather ؛ // أي ما يعادل shiftDown (NewFather). إذا تبين أن NewFather هو الطفل الأيسر للأب ، فهذا يعادل shiftDown (2*الأب)}}} الثابت العام <t يمتد قابلاً للمقارنة <؟ super t >> void sort (t [] arr) {int len = arr.length ؛ maxheap <T> maxheap = جديد maxheap <> (arr) ؛ maxheap.printastree () ؛ لـ (int i = len-1 ؛ i> = 0 ؛ i--) {arr [i] = maxheap.popmax () ؛ }} printarr printarr (Object [] arr) {for (object o: arr) {system.out.print (o) ؛ system.out.print ("/t") ؛ } system.out.println () ؛ } Public void printspace (int n) {// print n spaces (تستخدم مع '/t' هنا بدلاً من ذلك) لـ (int i = 0 ؛ i <n ؛ i ++) {system.out.printf ("٪ 3S" ، "") ؛ }} public void printastreate () {int linenum = 1 ؛ // First Traverse الخط الأول لخطوط int = (int) (math.log (size)/math.log (2)) + 1 ؛ // الأسطر هو عدد طبقات الكومة int spacenum = (int) (math.pow (2 ، سطور) - 1) ؛ لـ (int i = 1 ؛ i <= size ؛) {// لأن البيانات يتم تخزينها في الفاصل الزمني المغلقة اليسرى واليمين في [1 ... الحجم] ، لا تخزن البيانات [0] البيانات // كل طبقة تطبع هذا الفاصل [2^(رقم الطبقة 1) ... (2^رقم الطبقة) -1]. إذا كان الرقم الموجود في الكومة لا يكفي (2^ طبقات) -1 ، طباعة إلى الحجم. لذلك خذ دقيقة ((2^ طبقات) -1 ، الحجم). لـ (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" ، البيانات [J]) ؛ // print data system.out.printf ("٪ 3S" ، "") ؛ // Box Green in the Picture Printspace (Spacenum) ؛ // مسافات الطباعة مع الفضاء i ++ ؛ // يتم طباعة كل عنصر ، فهو+1} الكتان ++ ؛ فضاء = فضاء / 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} ؛ فرز (ARR) ؛ }}نتائج التنفيذ:
لخص
ما سبق هو كل محتوى هذه المقالة حول مشاركة رمز الطباعة في لغة Java التي تنفذ أكوامًا ثنائية. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!