參考教材p212,完成鏈樹LinkedBinaryTree的實現(getRight,contains,toString,preorder,postorder)
用JUnit或本身編寫驅動類對本身實現的LinkedBinaryTree進行測試,提交測試代碼運行截圖,要全屏,包含本身的學號信息
課下把代碼推送到代碼託管平臺html
鏈樹LinkedBinaryTree其實課本上已經有基本的框架代碼了,要本身編寫的就是getRight,contains,toString,preorder,postorder這些代碼。
java
getRight和getLeft編寫的時候其實時遇到了一些問題,最後換了上述的寫法。
express
基於LinkedBinaryTree,實現基於(中序,先序)序列構造惟一一棵二㕚樹的功能,好比給出中序HDIBEMJNAFCKGL和後序ABDHIEJMNCFGKL,構造出附圖中的樹
用JUnit或本身編寫驅動類對本身實現的功能進行測試,提交測試代碼運行截圖,要全屏,包含本身的學號信息
課下把代碼推送到代碼託管平臺安全
(我如今以爲本身的腦子快要氣死了,如今是11月19號,我在寫實驗三的博客時,以實驗二的博客做爲模板,結果直接在上面對實驗1和2進行了更改,尚未發現什麼不對,直接保存了,並且尚未備份。個人人生,一片灰暗,啊啊啊啊啊ε=ε=ε=(#>д<)ノ,只好重寫了一遍,可是當時的有些圖片已經找不到了了,因此接下來的圖是藍墨雲中找回來的)。數據結構
本身設計並實現一顆決策樹
提交測試代碼運行截圖,要全屏,包含本身的學號信息
課下把代碼推送到代碼託管平臺框架
輸入中綴表達式,使用樹將中綴表達式轉換爲後綴表達式,並輸出後綴表達式和計算結果(若是沒有用樹,則爲0分)
提交測試代碼運行截圖,要全屏,包含本身的學號信息
課下把代碼推送到代碼託管平臺源碼分析
在課本第十章編寫了一個表達式樹的類,其中的思路就是操做數一個棧,操做符一個棧來構造一棵二叉樹。這個實驗的思路就是同樣利用表達式樹的原理,
將輸入的中綴表達式讀取構建一棵二叉樹,想要變成後綴表達式,其實就是將這顆二叉樹後序遍歷輸出。post
關鍵代碼爲:性能
ExpressionTree operand1,operand2; char operator; String tempToken; Scanner parser = new Scanner(expression); while(parser.hasNext()){ tempToken = parser.next(); operator=tempToken.charAt(0); if ((operator == '+') || (operator == '-') || (operator=='*') || (operator == '/')){ if (ope.empty()) ope.push(tempToken);//當儲存符號的棧爲空時,直接進棧 else{ String a =ope.peek()+""; if (((a.equals("+"))||(a.equals("-")))&&((operator=='*')||(operator=='/'))) ope.push(tempToken);//當獲得的符號的優先級大於棧頂元素時,直接進棧 else { String s = String.valueOf(ope.pop()); char temp = s.charAt(0); operand1 = getOperand(treeExpression); operand2 = getOperand(treeExpression); treeExpression.push(new ExpressionTree (new ExpressionTreeOp(1, temp, 0), operand2, operand1)); ope.push(operator); }//當獲得的符號的優先級小於棧頂元素或者優先級相同時時,數字棧出來兩個運算數,造成新的樹進棧 } } else treeExpression.push(new ExpressionTree(new ExpressionTreeOp (2,' ',Integer.parseInt(tempToken)), null, null)); } while(!ope.empty()){ String a = String.valueOf(ope.pop()); operator = a.charAt(0); operand1 = getOperand(treeExpression); operand2 = getOperand(treeExpression); treeExpression.push(new ExpressionTree (new ExpressionTreeOp(1, operator, 0), operand2, operand1)); } return treeExpression.peek(); } public String getTree() { return (treeExpression.peek()).printTree(); } public int getResult(){ return treeExpression.peek().evaluateTree(); } public String PostOrder(){ Iterator iterator = treeExpression.peek().iteratorPostOrder(); String result=""; for (;iterator.hasNext();) result +=iterator.next()+" "; return result; }
完成PP11.3,對於二叉查找樹的鏈表實現,請實現removeMax、findMin和findMax等操做。
提交測試代碼運行截圖,要全屏,包含本身的學號信息
課下把代碼推送到代碼託管平臺學習
public T removeMin() throws EmptyCollectionException { T result = null; if (isEmpty()) throw new EmptyCollectionException("LinkedBinarySearchTree"); else { //若是根元素沒有左孩子,根就是最小的元素,根元素變爲原根元素的右孩子 if (root.left == null) { result = root.element; root = root.right; } //若是根有左孩子 else { BinaryTreeNode<T> parent = root; BinaryTreeNode<T> current = root.left; while (current.left != null) { parent = current; current = current.left; } result = current.element; parent.left = current.right; } modCount--; } return result; } public T removeMax() throws EmptyCollectionException { T result = null; if (isEmpty()) throw new EmptyCollectionException("LinkedBinarySearchTree"); else { //若是沒有右孩子 if (root.right == null) { result = root.element; root = root.left; } //若是有右孩子 else { BinaryTreeNode<T> parent = root; BinaryTreeNode<T> current = root.right; while (current.right != null) { parent = current; current = current.right; } result = current.element; parent.right = current.left; } modCount--; } return result; } public T findMin() throws EmptyCollectionException { T result = null; if (isEmpty()) throw new EmptyCollectionException("LinkedBinarySearchTree"); else { if (root.left == null) { result = root.element; } else { BinaryTreeNode<T> parent = root; BinaryTreeNode<T> current = root.left; while (current.left != null) { parent = current; current = current.left; } result = current.element; } } return result; } public T findMax() throws EmptyCollectionException { T result = null; if (isEmpty()) throw new EmptyCollectionException("LinkedBinarySearchTree"); else { if (root.right == null) { result = root.element; } else { BinaryTreeNode<T> parent = root; BinaryTreeNode<T> current = root.right; while (current.right != null) { parent = current; current = current.right; } result = current.element; } } return result; }
參考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)
學習的資料:Java Collections API源碼分析
TreeMap 是什麼?
TreeMap 是一個有序的key-value集合,它是經過紅黑樹實現的。
TreeMap 繼承於AbstractMap,因此它是一個Map,即一個key-value集合。
TreeMap 實現了NavigableMap接口,意味着它支持一系列的導航方法。好比返回有序的key集合。
TreeMap 實現了Cloneable接口,意味着它能被克隆。
TreeMap 實現了java.io.Serializable接口,意味着它支持序列化。
TreeMap基於紅黑樹(Red-Black tree)實現。該映射根據其鍵的天然順序進行排序,或者根據建立映射時提供的 Comparator 進行排序,具體取決於使用的構造方法。
TreeMap的基本操做 containsKey、get、put 和 remove 的時間複雜度是 log(n) 。
另外,TreeMap是非同步的。 它的iterator 方法返回的迭代器是fail-fastl的。
這是大多數參考資料上給出的關於TreeMap的簡介,可是裏面還涉及到了不少的其餘的有關概念,因此不太好理解,我也翻看了一些資料,在上面點擊就能夠查看。關於代碼的理解能夠看一下Java 集合系列12之 TreeMap詳細介紹(源碼解析)和使用示例
Hashmap是什麼?Java 集合系列10之 HashMap詳細介紹(源碼解析)和使用示例
HashMap 是一個散列表,它存儲的內容是鍵值對(key-value)映射。
HashMap 繼承於AbstractMap,實現了Map、Cloneable、java.io.Serializable接口。
HashMap 的實現不是同步的,這意味着它不是線程安全的。它的key、value均可覺得null。此外,HashMap中的映射不是有序的。
HashMap 的實例有兩個參數影響其性能:「初始容量」 和 「加載因子」。容量 是哈希表中桶的數量,初始容量 只是哈希表在建立時的容量。加載因子 是哈希表在其容量自動增長以前能夠達到多滿的一種尺度。當哈希表中的條目數超出了加載因子與當前容量的乘積時,則要對該哈希表進行 rehash 操做(即重建內部數據結構),從而哈希表將具備大約兩倍的桶數。
一般,默認加載因子是 0.75, 這是在時間和空間成本上尋求一種折衷。加載因子太高雖然減小了空間開銷,但同時也增長了查詢成本(在大多數 HashMap 類的操做中,包括 get 和 put 操做,都反映了這一點)。在設置初始容量時應該考慮到映射中所需的條目數及其加載因子,以便最大限度地減小 rehash 操做次數。若是初始容量大於最大條目數除以加載因子,則不會發生 rehash 操做。
HashMap和TreeMap最本質的區別:
HashMap經過hashcode方法對其內容進行快速查找,而 TreeMap中全部的元素都保持着某種固定的順序,若是你須要獲得一個有序的結果你就應該使用TreeMap,由於HashMap中元素的排列順序是不固定的。
問題一:在實驗二—2中,想要用迭代的方式繼續處理左右子樹,可是估計是參數寫錯了,因而出現了這樣的錯誤。
問題一的解決方案:形參的編寫必定要仔細,否則就極可能得不到正確的結果。肉眼難以找出本身的思路錯誤,因而進行了代碼調試。
問題二:在實驗二 樹-4-表達式樹中寫的方法最開始是對於「/」操做符的放入是有問題的,就像:
因此判斷是下面這段代碼放入操做符的時候出現了問題。
if (((ope.peek().equals("+"))||(ope.peek().equals("-")))&&((operator=='*')||(operator=='/'))) ope.push(tempToken);
因而進行調試
此次的實驗有簡單的也有困難的,發現本身有時候的思路真的挺奇葩的。對於第六個那種純看文字學習的實驗我有些轉不動腦子,日常自學其實都用的是紙質課本,能夠在上面勾勾畫畫,但看電腦個人思惟就很容易跑偏,因此看了好幾遍第六個實驗,看來之後仍是要多克服克服這種思惟不集中的問題,提升一下學習的效率。還有要感謝一下隊友的幫助,否則問題都還解決不了。