實驗步驟:html
public LinkedBinaryTree<T> getRight() { if (root == null) throw new EmptyCollectionException("Get right operation " + "failed. The tree is empty."); LinkedBinaryTree<T> result = new LinkedBinaryTree<T>(); result.root = root.getRight(); return result; } public boolean contains (T target) { if (root.find(target) != null) return true; else return false; } public String toString() { ArrayIterator<T> lxr=new ArrayIterator(); lxr= (ArrayIterator<T>) levelorder();//強制轉化 String content=""; for (T i: lxr){//臨時引用lxr的每個元素 content += i +" "; } return content; } public Iterator<T> preorder() { ArrayIterator<T> iter = new ArrayIterator <>(); if (root != null) root.preorder(iter); return iter; } public Iterator<T> postorder() { ArrayIterator<T> iter = new ArrayIterator<T>(); if(root!=null){ root.postorder (iter); } return iter;} public boolean isEmpty() { if (root.count() != 0) return false; else return true; }
getLeft()
套用補全getRight()
find
方法,該方法最後會返回查找的元素,則使用find查找target目標元素,根據查找結果返回true或falsetoString
方法有些複雜,由於最後打印的結果要一目瞭然,知道樹的輪廓,因此我選擇使用levelorder()
層序遍從來打印。將樹中的元素進行層序遍歷,建立T創建for循環臨時引用樹中的每個元素並將其加入一個String的變量上,最後返回它。最後測試,創建一個樹如圖,獲得打印結果1 2 3 4 5
代碼連接
參考連接:我參考了這位博主的博客根據先序和中序遍歷重建二叉樹java實現,依葫蘆畫瓢完成實驗
實驗步驟:java
代碼連接
實驗步驟:git
public void Asking() { Scanner scan = new Scanner(System.in); System.out.println("猜人遊戲,你只能回答「是」或「否」,這裏有若干我的可供你選擇:劉先潤,李一桐,張靚穎,楊冪,艾瑪沃特森,盧本偉,馬軍,劉偉康"); while(NewTree.size()>0){ System.out.println(NewTree.getRootElement()); String a=scan.nextLine(); if (a.equalsIgnoreCase("否")){ if(NewTree.getRight()!=null) { NewTree = NewTree.getRight(); }else { break; } } else { if(NewTree.getLeft()!=null) { NewTree = NewTree.getLeft(); }else { break; } }
代碼連接
實驗步驟:算法
1 + 6 * 9 -8 / 2
,將其構建進這個樹中,可知創建的形狀以下圖所示代碼連接
實驗步驟:數組
public T findMin() { if (root == null) { return null; } if (root!=null && root.getLeft()==null) { return root.getElement(); } while (root.getLeft() != null) { root = root.getLeft(); if (root.getLeft()==null) { break; } }return root.getElement(); }
首先我須要瞭解紅黑樹的概念,何爲紅黑樹?它是一種特殊的二叉查找樹。紅黑樹的每一個節點上都有存儲位表示節點的顏色。根結點是黑色,結點顏色與子結點顏色不一樣。主要是用它來存儲有序的數據,它的時間複雜度是O(lgn),效率很是之高。附上參考資料連接:紅黑樹(一)之 原理和算法詳細介紹、HashMap詳細介紹
而後分析TreeMap,它是基於紅黑樹的 NavigableMap 實現。該映射根據其鍵的天然順序進行排序,或者根據建立映射時提供的 Comparator 進行排序,具體取決於使用的構造方法。 TreeMap存儲的是key-value鍵值對,TreeMap的排序是基於對key的排序,它本質上就是一個紅黑樹。它內部有 Comparator用來給TreeMap排序,帶有Map和SortMap的構造函數會成爲TreeMap的子集。
分析具體的方法get,獲取鍵key對應的值value,首先要獲取key鍵的節點p,若節點p不爲null,返回節點對應的值。app
public V get(Object key) { Entry<K,V> p = getEntry(key); return (p==null ? null : p.value); }
分析putAll方法,它的做用是將map中的所有節點添加到TreeMap中。首先獲取map的大小,若是TreeMap的大小是0,且map的大小不是0,且map是已排序的「key-value對」,若是TreeMap和Map的comparator相等,則將map的元素所有拷貝到TreeNap中,而後返回。最後調用AbstractMap中的putAll(),而putAll()又會調用TreeMap的put()。函數
public void putAll(Map<? extends K, ? extends V> map) { int mapSize = map.size(); if (size==0 && mapSize!=0 && map instanceof SortedMap) { Comparator c = ((SortedMap)map).comparator(); if (c == comparator || (c != null && c.equals(comparator))) { ++modCount; try { buildFromSorted(mapSize, map.entrySet().iterator(), null, null); } catch (java.io.IOException cannotHappen) { } catch (ClassNotFoundException cannotHappen) { } return; } } super.putAll(map); }
對TreeMap有一個初步瞭解後再分析HashMap,經過查閱JDK文件得知,HashMap是基於哈希表的 Map 接口的實現。此實現提供全部可選的映射操做,並容許使用 null 值和 null 鍵。HashMap 是一個散列表,它存儲的內容是鍵值對(key-value)映射。HashMap有兩個重要參數,它存在一個容量(哈希表中桶的數量)和一個加載因子(容量自動增長以前能夠達到多滿的一種尺度)
接着分析源碼,HashMap中的key-value都是存儲在Entry數組中的。它有4個構造函數,例以下列代碼,這是一個默認的構造函數,它首先設置加載因子,而後設置「HashMap閾值」,當HashMap中存儲的量達到threshold時,就將HashMap的容量加倍。最後建立Entry數組保存數據。源碼分析
public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); table = new Entry[DEFAULT_INITIAL_CAPACITY]; init(); }
再分析一個方法get(),返回指定鍵所映射的值;若是對於該鍵來講,此映射不包含任何映射關係,則返回 null。它首先會獲取key的hash值,在該hash值對應的鏈表上查找鍵值爲key的元素。post
public V get(Object key) { if (key == null) return getForNullKey(); int hash = hash(key.hashCode()); for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) return e.value; } return null; }
經過本次源碼分析對TreeMap和HashMap有了更深的瞭解,它的方法實現思路很是值得像我這樣的新手學習借鑑。學習