1. 程式人生 > >二叉堆(三)之 Java的實現

二叉堆(三)之 Java的實現

  1 /**
  2  * 二叉堆(最大堆)
  3  *
  4  * @author skywang
  5  * @date 2014/03/07
  6  */
  7 
  8 import java.util.ArrayList;
  9 import java.util.List;
 10 
 11 public class MaxHeap<T extends Comparable<T>> {
 12 
 13     private List<T> mHeap;    // 佇列(實際上是動態陣列ArrayList的例項)
 14 
 15
public MaxHeap() { 16 this.mHeap = new ArrayList<T>(); 17 } 18 19 /* 20 * 最大堆的向下調整演算法 21 * 22 * 注:陣列實現的堆中,第N個節點的左孩子的索引值是(2N+1),右孩子的索引是(2N+2)。 23 * 24 * 引數說明: 25 * start -- 被下調節點的起始位置(一般為0,表示從第1個開始) 26 * end -- 截至範圍(一般為陣列中最後一個元素的索引)
27 */ 28 protected void filterdown(int start, int end) { 29 int c = start; // 當前(current)節點的位置 30 int l = 2*c + 1; // 左(left)孩子的位置 31 T tmp = mHeap.get(c); // 當前(current)節點的大小 32 33 while(l <= end) { 34 int cmp = mHeap.get(l).compareTo(mHeap.get(l+1));
35 // "l"是左孩子,"l+1"是右孩子 36 if(l < end && cmp<0) 37 l++; // 左右兩孩子中選擇較大者,即mHeap[l+1] 38 cmp = tmp.compareTo(mHeap.get(l)); 39 if(cmp >= 0) 40 break; //調整結束 41 else { 42 mHeap.set(c, mHeap.get(l)); 43 c = l; 44 l = 2*l + 1; 45 } 46 } 47 mHeap.set(c, tmp); 48 } 49 50 /* 51 * 刪除最大堆中的data 52 * 53 * 返回值: 54 * 0,成功 55 * -1,失敗 56 */ 57 public int remove(T data) { 58 // 如果"堆"已空,則返回-1 59 if(mHeap.isEmpty() == true) 60 return -1; 61 62 // 獲取data在陣列中的索引 63 int index = mHeap.indexOf(data); 64 if (index==-1) 65 return -1; 66 67 int size = mHeap.size(); 68 mHeap.set(index, mHeap.get(size-1));// 用最後元素填補 69 mHeap.remove(size - 1); // 刪除最後的元素 70 71 if (mHeap.size() > 1) 72 filterdown(index, mHeap.size()-1); // 從index號位置開始自上向下調整為最小堆 73 74 return 0; 75 } 76 77 /* 78 * 最大堆的向上調整演算法(從start開始向上直到0,調整堆) 79 * 80 * 注:陣列實現的堆中,第N個節點的左孩子的索引值是(2N+1),右孩子的索引是(2N+2)。 81 * 82 * 引數說明: 83 * start -- 被上調節點的起始位置(一般為陣列中最後一個元素的索引) 84 */ 85 protected void filterup(int start) { 86 int c = start; // 當前節點(current)的位置 87 int p = (c-1)/2; // 父(parent)結點的位置 88 T tmp = mHeap.get(c); // 當前節點(current)的大小 89 90 while(c > 0) { 91 int cmp = mHeap.get(p).compareTo(tmp); 92 if(cmp >= 0) 93 break; 94 else { 95 mHeap.set(c, mHeap.get(p)); 96 c = p; 97 p = (p-1)/2; 98 } 99 } 100 mHeap.set(c, tmp); 101 } 102 103 /* 104 * 將data插入到二叉堆中 105 */ 106 public void insert(T data) { 107 int size = mHeap.size(); 108 109 mHeap.add(data); // 將"陣列"插在表尾 110 filterup(size); // 向上調整堆 111 } 112 113 @Override 114 public String toString() { 115 StringBuilder sb = new StringBuilder(); 116 for (int i=0; i<mHeap.size(); i++) 117 sb.append(mHeap.get(i) +" "); 118 119 return sb.toString(); 120 } 121 122 public static void main(String[] args) { 123 int i; 124 int a[] = {10, 40, 30, 60, 90, 70, 20, 50, 80}; 125 MaxHeap<Integer> tree=new MaxHeap<Integer>(); 126 127 System.out.printf("== 依次新增: "); 128 for(i=0; i<a.length; i++) { 129 System.out.printf("%d ", a[i]); 130 tree.insert(a[i]); 131 } 132 133 System.out.printf("\n== 最 大 堆: %s", tree); 134 135 i=85; 136 tree.insert(i); 137 System.out.printf("\n== 新增元素: %d", i); 138 System.out.printf("\n== 最 大 堆: %s", tree); 139 140 i=90; 141 tree.remove(i); 142 System.out.printf("\n== 刪除元素: %d", i); 143 System.out.printf("\n== 最 大 堆: %s", tree); 144 System.out.printf("\n"); 145 } 146 }

相關推薦

() Java實現

1 /** 2 * 二叉堆(最大堆) 3 * 4 * @author skywang 5 * @date 2014/03/07 6 */ 7 8 import java.util.ArrayList; 9 import java.util.L

Java併發(十八):阻塞佇列BlockingQueue BlockingQueue(阻塞佇列)詳解 二叉堆(一) 圖文解析 和 C語言的實現 多執行緒程式設計:阻塞、併發佇列的使用總結 Java併發程式設計:阻塞佇列 java阻塞佇列 BlockingQueue(阻塞佇列)詳解

阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者

(一) 圖文解析 和 C語言的實現

1 /** 2 * 二叉堆(最大堆) 3 * 4 * @author skywang 5 * @date 2014/03/07 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h

數據結構實現(四)查找樹java實現

.com ML treenode 設置 AC getparent 邏輯圖 技術分享 ldb 轉載 http://www.cnblogs.com/CherishFX/p/4625382.html 二叉查找樹的定義:   二叉查找樹或者是一顆空樹,或者是一顆具有以下特性的非空二

類模板的實現以及使用它進行排序

二叉堆:二叉堆一棵完全二叉樹,從遞迴的定義來講,對於完全二叉樹的任何一個節點,其左孩子要麼是空樹要麼是一個完全二叉樹,右孩子同上。 堆:對於一個堆來講,可以是一個大根堆,也可以是一個小根堆。 大根堆的性質:對於在大根堆任何一個節點,其值不小於左右孩子的值。 小根堆的性質:對於在大

資料結構與演算法 -- 搜尋樹(java實現

package com.huang.test.datastructure; import java.util.*; /** * 二叉搜尋樹 */ abstract class BstData<T> { BstData<T> left;

樹基礎操作 ,前中後序遍歷,求樹高度,搜尋樹(排序樹)Java實現 程式碼集合

首先,定義一個樹類Tree.java public class Tree { public TreeNode root; } 定義樹節點類TreeNode.java public class TreeNode { public TreeNode(int

普通的搜尋樹總結+java實現

目錄 二叉搜尋樹的概念 結構 節點類 二叉搜尋樹類 實現-增刪查 插入節點 建立二叉搜尋樹 搜尋節點 刪除節點 應用 搜尋 排序 完整程式碼 二叉搜尋樹的概念 二叉搜尋樹(Binary Search Tree)節點放置:任何節點

劍指Offer - 樹的深度(Java實現)

題目描述: 輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 思路分析: 方法1:遞迴的思想解決問題。 public class Solution { public int TreeDe

排序樹,java實現(知識簡單的實現,持續完善更新)

定義: 二叉排序樹就是左子樹都比節點小,右子樹都比節點大。簡單的排序二叉樹實現。 程式碼: package com.wzq.data_structure; public class Bina

排序樹的java實現

最近在看JDK原始碼時,發現JDK的J.U.C包下面的很多類都用到了二叉排序樹和紅黑樹,就想著這一塊還是考研的時候看了的,順便就在理論基礎上覆習加用Java做個實現。 二叉排序樹 先來說說這個二叉排序樹的定義和性質: 定義:二叉排序樹或者

列印樹所有路徑---JAVA實現

思路:把當前結點儲存到陣列當中,如果當前結點為葉子結點就列印當前陣列,採取遞迴的方式來進行操作。 技巧一:就是陣列的問題,所有路徑結點都存到一個數組當中,由於陣列傳遞是傳址,改變陣列指向內容的時候其他

劍指offer--面試題19:樹的映象--Java實現

題目描述: 請完成一個函式,輸入一個二叉樹,該函式輸出它的映象。 解題思路: 我們先前序遍歷這棵樹的每個結點,如果這個結點有子結點,就交換它的兩個子結點。當交換完所有非葉子結點的左右子結點後,就得到了樹的映象。 這裡採用了遞迴方式和非遞迴方式。

排序樹建立(JAVA實現)

      最近看了一下二叉排序樹的建立,自己寫了一段程式碼,用來建立二叉排序樹,給定一個數組,對這個陣列中的數字進行建立二叉排序樹。分兩種情況:      1  陣列中的數字是隨機的,也就是說沒有順序 eg : int  a [ ] = {3,1,2,5,0,7,9,8}

樹的深度java實現

輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 思路:採用遞迴遍歷的方法,每深入一層,層數加一,最後一層所指向的nul

打印(Java實現)

排序 item print images ray lines 堆排序 swa compare 打印二叉堆:利用層級關系 我這裏是先將堆排序,然後在sort裏執行了打印堆的方法printAsTree() public class MaxHeap<

排序演算法——優先佇列經典實現(基於

許多應用都需要處理有序的元素,但有時,我們不要求所有元素都有序,或是一定要一次就將它們排序,許多情況下,我們會收集這些元素裡的最大值或最小值。 這種情況下一個合適的資料結構應該支援兩種操作:插入元素、刪除最大元素。 優先佇列與棧和佇列類似,但它有自己的奇妙之處。 在本文中,會講解基於二叉堆的一種優先佇列

種遍歷方式及通過兩種遍歷重構樹(java實現

重構方法參考文章【重構二叉樹(Java實現):https://blog.csdn.net/wangbingcsu/article/details/51372695】 文章目錄 二叉樹類 三種遍歷方式 前序遍歷 中序遍歷 後序遍歷

Java實現種遍歷演算法

</pre><p></p><p>參考網上一些資料測試整理了一下二叉樹遍歷的Java實現程式碼。</p>二叉樹三種遍歷方式:先序遍歷、中序遍歷、後序遍歷。<p>首先定義二叉樹類:</p>&l

判斷兩棵樹是否相同java實現

package com.cb.java.algorithms.jianzhioffer.tree; /** * 判斷兩個二叉樹是否相同 * * @author 36184 * */ pub