課程:《程序設計與數據結構》
班級: 1723
姓名: 胡智韜
學號:20172315
實驗教師:王志強
實驗日期:2018年11月2日
必修/選修: 必修php
參考教材p212,完成鏈樹LinkedBinaryTree的實現(getRight,contains,toString,preorder,postorder)html
用JUnit或本身編寫驅動類對本身實現的LinkedBinaryTree進行測試,提交測試代碼運行截圖,要全屏,包含本身的學號信息java
課下把代碼推送到代碼託管平臺web
基於LinkedBinaryTree,實現基於(中序,先序)序列構造惟一一棵二㕚樹的功能,好比給出中序HDIBEMJNAFCKGL和後序ABDHIEJMNCFGKL,構造出附圖中的樹數組
用JUnit或本身編寫驅動類對本身實現的功能進行測試,提交測試代碼運行截圖,要全屏,包含本身的學號信息數據結構
課下把代碼推送到代碼託管平臺
app
本身設計並實現一顆決策樹函數
提交測試代碼運行截圖,要全屏,包含本身的學號信息源碼分析
課下把代碼推送到代碼託管平臺post
輸入中綴表達式,使用樹將中綴表達式轉換爲後綴表達式,並輸出後綴表達式和計算結果(若是沒有用樹,則爲0分)
提交測試代碼運行截圖,要全屏,包含本身的學號信息
課下把代碼推送到代碼託管平臺
完成PP11.3
提交測試代碼運行截圖,要全屏,包含本身的學號信息
課下把代碼推送到代碼託管平臺
參考http://www.cnblogs.com/rocedu/p/7483915.html對Java中的紅黑樹(TreeMap,HashMap)進行源碼分析,並在實驗報告中體現分析結果。
(C:\Program Files\Java\jdk-11.0.1\lib\src\java.base\java\util)
課下把代碼推送到代碼託管平臺
Entry是HashMap中的一個靜態內部類。代碼以下
static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next;//存儲指向下一個Entry的引用,單鏈表結構 int hash;//對key的hashcode值進行hash運算後獲得的值,存儲在Entry,避免重複計算 /** * Creates new entry. */ Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; }
簡單來講,HashMap由數組+鏈表組成的,數組是HashMap的主體,鏈表則是主要爲了解決哈希衝突而存在的,若是定位到的數組位置不含鏈表(當前entry的next指向null),那麼對於查找,添加等操做很快,僅需一次尋址便可;若是定位到的數組包含鏈表,對於添加操做,其時間複雜度爲O(n),首先遍歷鏈表,存在即覆蓋,不然新增;對於查找操做來說,仍需遍歷鏈表,而後經過key對象的equals方法逐一比對查找。因此,性能考慮,HashMap中的鏈表出現越少,性能纔會越好。
public HashMap(int initialCapacity, float loadFactor) { //此處對傳入的初始容量進行校驗,最大不能超過MAXIMUM_CAPACITY = 1<<30(230) if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); this.loadFactor = loadFactor; threshold = initialCapacity; init();//init方法在HashMap中沒有實際實現,不過在其子類如 linkedHashMap中就會有對應實現 }
從上面這段代碼咱們能夠看出,在常規構造器中,沒有爲數組table分配內存空間(有一個入參爲指定Map的構造器例外),而是在執行put操做的時候才真正構建table數組
在詳細介紹TreeMap的代碼以前,咱們先創建一個總體概念。
TreeMap是經過紅黑樹實現的,TreeMap存儲的是key-value鍵值對,TreeMap的排序是基於對key的排序。
TreeMap提供了操做「key」、「key-value」、「value」等方法,也提供了對TreeMap這顆樹進行總體操做的方法,如獲取子樹、反向樹。
1 默認構造函數
public TreeMap() { comparator = null; }
2 帶比較器的構造函數
public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator; }
3 帶Map的構造函數,Map會成爲TreeMap的子集
public TreeMap(Map<? extends K, ? extends V> m) { comparator = null; putAll(m); }
該構造函數會調用putAll()將m中的全部元素添加到TreeMap中。putAll()源碼以下:
public void putAll(Map<? extends K, ? extends V> m) { for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) put(e.getKey(), e.getValue()); }
從中,咱們能夠看出putAll()就是將m中的key-value逐個的添加到TreeMap中。
4 帶SortedMap的構造函數,SortedMap會成爲TreeMap的子集
public TreeMap(SortedMap<K, ? extends V> m) { comparator = m.comparator(); try { buildFromSorted(m.size(), m.entrySet().iterator(), null, null); } catch (java.io.IOException cannotHappen) { } catch (ClassNotFoundException cannotHappen) { } }
該構造函數不一樣於上一個構造函數,在上一個構造函數中傳入的參數是Map,Map不是有序的,因此要逐個添加。
而該構造函數的參數是SortedMap是一個有序的Map,咱們經過buildFromSorted()來建立對應的Map。
問題1:在作實驗4時不知道該如何寫
問題1解決方案:能夠利用二叉樹求得後綴表達式,首先利用中綴表達式構造二叉樹,數字是葉子節點,操做符爲根節點。每次找到「最後計算」的運算符,做爲當前根節點,運算符左側表達式做爲左節點,右側表達式做爲右節點,而後遞歸處理(http://www.xuebuyuan.com/388108.html)。9+(3-1)*3+10/2對應的二叉樹的構造過程以下圖所示:
此二叉樹作後序遍歷就獲得了後綴表達式。