課程:《程序設計與數據結構》
班級: 1723
姓名: 趙乾宸
學號:20172316
實驗教師:王志強
必修/選修:必修html
參考教材p212,完成鏈樹LinkedBinaryTree的實現(getRight,contains,toString,preorder,postorder)
用JUnit或本身編寫驅動類對本身實現的LinkedBinaryTree進行測試,提交測試代碼運行截圖,要全屏,包含本身的學號信息
課下把代碼推送到代碼託管平臺數組
基於LinkedBinaryTree,實現基於(中序,先序)序列構造惟一一棵二㕚樹的功能,好比給出中序HDIBEMJNAFCKGL和後序ABDHIEJMNCFGKL,構造出附圖中的樹
用JUnit或本身編寫驅動類對本身實現的功能進行測試,提交測試代碼運行截圖,要全屏,包含本身的學號信息
課下把代碼推送到代碼託管平臺數據結構
本身設計並實現一顆決策樹
提交測試代碼運行截圖,要全屏,包含本身的學號信息
課下把代碼推送到代碼託管平臺源碼分析
輸入中綴表達式,使用樹將中綴表達式轉換爲後綴表達式,並輸出後綴表達式和計算結果
提交測試代碼運行截圖,要全屏,包含本身的學號信息
課下把代碼推送到代碼託管平臺post
完成PP11.3
提交測試代碼運行截圖,要全屏,包含本身的學號信息
課下把代碼推送到代碼託管平臺學習
參考http://www.cnblogs.com/rocedu/p/7483915.html對Java中的紅黑樹(TreeMap,HashMap)進行源碼分析,並在實驗報告中體現分析結果。
課下把代碼推送到代碼託管平臺測試
實驗按照1-6順序依次完成。設計
(1)LinkedBinaryTree的實現。3d
截圖時未實現toString
方法,後來添加了toString
,是以層序遍歷的方式輸出樹。code
(2)基於LinkedBinaryTree,實現基於(中序,先序)序列構造惟一一棵二㕚樹的功能
樹的總體畫在圖上,爲肯定構造二叉樹的正確性,輸出了樹的三種遍歷,即最下三條,由上到下分別爲先序、中序、後序
(3)本身設計並實現一顆決策樹。
設計了一個關於「今晚去哪裏學習/休息?」的決策樹,由書中背部疼痛診斷器改造。
(4)輸入中綴表達式,使用樹將中綴表達式轉換爲後綴表達式,並輸出後綴表達式和計算結果
計算結果的樹借用了書中例子,中綴轉後綴比較複雜,也遇到了一些問題,在下方分析。
(5)完成PP11.3
實現removeMax
findMin
findMax
方法,
findMin
方法主要部分截取:
if (root.left == null) { result = root.element; } else { BinaryTreeNode<T> current = root.left; while (current.left != null) { current = current.left; } result = current.element; }
實現的原理就是二叉查找樹的左節點 < 父節點 < 右節點,最左的節點則是元素最小的節點,findMax
同理。
removeMax
則在find的基礎上刪除便可,因爲刪除的是最大節點,徹底不用考慮會刪除掉中間的節點致使樹斷開。
(6)
實驗二-4,中綴轉後綴,一開始沒有思路,在網上各處查找相關文章,整理出來大體思路(↓碼中註釋↓),放在才最後解決
public String toSuffix(String infix) { String result = ""; String[] array = infix.split("\\s+"); // 以String數組存儲中綴表達式的每一個數字、符號 Stack<LinkedBinaryTree> num = new Stack(); // 數字棧 Stack<LinkedBinaryTree> op = new Stack(); // 操做符棧 for (int a = 0; a < array.length; a++) { if (array[a].equals("+") || array[a].equals("-") || array[a].equals("*") || array[a].equals("/")) { // 判斷數組中字符類型(數字or操做符),分別裝入兩個棧中 if (op.empty()) { op.push(new LinkedBinaryTree<>(array[a])); } else { if ((op.peek().root.element).equals("+") || (op.peek().root.element).equals("-") && array[a].equals("*") || array[a].equals("/")) { op.push(new LinkedBinaryTree(array[a])); // 若是操做符棧中已經有「+、-」操做符然後來的的是「*、/」,壓入op;若不是,進行樹的構建,再壓入op(優先級問題) } else { LinkedBinaryTree right = num.pop(); LinkedBinaryTree left = num.pop(); LinkedBinaryTree temp = new LinkedBinaryTree(op.pop().root.element, left, right); num.push(temp); // 在num中構建好子樹 op.push(new LinkedBinaryTree(array[a])); } } } else { num.push(new LinkedBinaryTree<>(array[a])); } } while (!op.empty()) { LinkedBinaryTree right = num.pop(); LinkedBinaryTree left = num.pop(); LinkedBinaryTree temp = new LinkedBinaryTree(op.pop().root.element, left, right); num.push(temp); } Iterator itr = num.pop().iteratorPostOrder(); // 之後序遍歷輸出構建好的整棵樹,後綴表達式完成。 while (itr.hasNext()){ result += itr.next()+" "; } return result; }
中綴式構建爲表達式樹的流程例子↓
其餘(感悟、思考等)
《Java程序設計與數據結構教程(第二版)》 《Java程序設計與數據結構教程(第二版)》學習指導