20172319 實驗二《樹》實驗報告
阿新 • • 發佈:2018-11-11
表達 提交代碼 添加 需求 後序 打印 nod 全屏 數據結構
20172319 2018.11.04-11.12
實驗二《樹》 實驗報告
課程名稱:《程序設計與數據結構》
學生班級:1723班
學生姓名:唐才銘
學生學號:20172319
實驗教師:王誌強老師
課程助教:張師瑜學姐、張之睿學長
實驗時間:2018年11月04日——2018年11月12日
必修/選修:必修
目錄
- 實驗內容
- 實驗要求
- 實驗步驟
- 代碼實現及解釋
- 測試過程及遇到的問題
- 分析總結
- 代碼托管
- 參考資料
實驗內容
- 實驗二-1-實現二叉樹: 完成鏈樹LinkedBinaryTree的實現。
- 實驗二 樹-2-中序先序序列構造二叉樹: 基於LinkedBinaryTree,實現基於(中序,先序)序列構造唯一一棵二?樹的功能
- 實驗二 樹-3-決策樹: 自己設計並實現一顆決策樹
- 實驗二 樹-4-表達式樹: 輸入中綴表達式,使用樹將中綴表達式轉換為後綴表達式,並輸出後綴表達式和計算結果
- 實驗二 樹-5-二叉查找樹: 完成PP11.3
- 實驗二 樹-6-紅黑樹分析: 參考http://www.cnblogs.com/rocedu/p/7483915.html對Java中的紅黑樹(TreeMap,HashMap)進行源碼分析,並在實驗報告中體現分析結果
返回目錄
實驗要求
- 完成藍墨雲上與實驗二《樹》相關的活動,及時提交代碼運行截圖和碼雲Git鏈接,截圖要有學號水印,否則會扣分。
- 完成實驗、撰寫實驗報告,實驗報告以博客方式發表在博客園,註意實驗報告重點是運行結果,遇到的問題(工具查找,安裝,使用,程序的編輯,調試,運行等)、解決辦法(空洞的方法如“查網絡”、“問同學”、“看書”等一律得0分)以及分析(從中可以得到什麽啟示,有什麽收獲,教訓等)。報告可以參考範飛龍老師的指導。
- 嚴禁抄襲,有該行為者實驗成績歸零,並附加其他懲罰措施。
返回目錄
實驗步驟
- 實驗二-1-實現二叉樹:
參考教材p212,完成鏈樹LinkedBinaryTree的實現(getRight,contains,toString,preorder,postorder)
用JUnit或自己編寫驅動類對自己實現的LinkedBinaryTree進行測試,提交測試代碼運行截圖,要全屏,包含自己的學號信息
課下把代碼推送到代碼托管平臺 - 實驗二 樹-2-中序先序序列構造二叉樹:
基於LinkedBinaryTree,實現基於(中序,先序)序列構造唯一一棵二?樹的功能,比如給出中序HDIBEMJNAFCKGL和後序ABDHIEJMNCFGKL,構造出附圖中的樹
用JUnit或自己編寫驅動類對自己實現的功能進行測試,提交測試代碼運行截圖,要全屏,包含自己的學號信息
課下把代碼推送到代碼托管平臺
- 實驗二 樹-3-決策樹:
自己設計並實現一顆決策樹
提交測試代碼運行截圖,要全屏,包含自己的學號信息
課下把代碼推送到代碼托管平臺 - 實驗二 樹-4-表達式樹:
輸入中綴表達式,使用樹將中綴表達式轉換為後綴表達式,並輸出後綴表達式和計算結果(如果沒有用樹,則為0分)
提交測試代碼運行截圖,要全屏,包含自己的學號信息
課下把代碼推送到代碼托管平臺 - 實驗二 樹-5-二叉查找樹:
完成PP11.3
提交測試代碼運行截圖,要全屏,包含自己的學號信息
課下把代碼推送到代碼托管平臺 - 實驗二 樹-5-二叉查找樹:
參考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)
前期準備:
- 預先下載安裝好IDEA 。
需求分析:
- 需要掌握二叉查找樹的相關知識;
- 需要掌握當任意給出兩個序能構建出唯一一棵二叉樹;
- 需要理解表達式樹的實現;
- 需要理解決策樹的實現。
返回目錄
代碼實現及解釋
本次實驗一共分為六個提交點:
- 實驗二-1-實現二叉樹:
- 根據自己的需求,寫好自己所需要的鏈表節點類及鏈表類
- 在鏈表類裏寫了add方法用於往鏈表添加元素
public void add(int number){
Linked_list_node Node = new Linked_list_node(number);
if (this.head==null){
this.head = Node;
}
else {
this.head.addLinked_list_node(Node);
}
}
- 具體的代碼實現:
System.out.println("實驗的第一部分:");
System.out.print("Enter some integers and create a linked list : ");
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
String[] strings = input.split(" ");
Stack<String> Break_up = new Stack<String>();
for (int i = strings.length; i > 0 ; i--){
Break_up.push(strings[i-1]);
}
System.out.print("The contents of the stack are : ");
System.out.println(Break_up);
Linked_list linked_list = new Linked_list();
linked_list.add(0);
while (!Break_up.empty()) {
int tempelement = Integer.parseInt(Break_up.pop());
linked_list.add(tempelement);
}
int ntangcaiming = 0;
ntangcaiming = linked_list.getCount();
System.out.print("The contents of the queue are : ");
System.out.println(linked_list);
System.out.print("The number of linked elements is : ");
System.out.println(ntangcaiming);
運行結果截圖:
- 線性結構之鏈表(2)
- 根據需要,我們需要寫插入和刪除的方法:
為了更好地實現需求,我們在鏈表前端放入了一個取值為0的節點
linked_list.add(0);
,以便於在任何地方都能實現插入刪除,而打印時將其隱藏。
public void insert(int index,Linked_list_node node){
if(index < 1||index > getCount() + 1){
System.out.println("Wrong position, cannot insert");
return;
}
int length = 1;
Linked_list_node temp = head;
while(head.next != null)
{
if(index == length++){
node.next = temp.next;
temp.next = node;
return;
}
temp = temp.next;
}
}
public void delete(int index){
if(index < 1 || index > getCount()){
System.out.println("Wrong position, cannot be deleted");
return;
}
int length=1;
Linked_list_node temp = head;
while(temp.next != null){
if(index == length++){
temp.next = temp.next.next;
return;
}
temp = temp.next;
}
}
- 根據以前所寫IO進行文件的創建及讀取;
- 本次提交點相關代碼如下:
System.out.println("實驗的第二部分:");
try {
File file = new File("D:\\huawei\\Javawindows文件","EXP1-First semester of sophomore.txt");
InputStreamReader reader = new InputStreamReader(new FileInputStream(file));
BufferedReader bufferedReader = new BufferedReader(reader);
int[] file_word_temp = new int[2];
String[] file_word = bufferedReader.readLine().split(" ");
file_word_temp[0] = Integer.parseInt(file_word[0]);
file_word_temp[1] = Integer.parseInt(file_word[1]);
Linked_list_node Node_insert1 = new Linked_list_node(file_word_temp[0]);
Linked_list_node Node_insert2 = new Linked_list_node(file_word_temp[1]);
linked_list.insert(5,Node_insert1);
System.out.print("The list after inserting 1 at the fifth position is : ");
System.out.println(linked_list);
System.out.print("The number of linked elements is : ");
ntangcaiming = linked_list.getCount();
System.out.println(ntangcaiming);
linked_list.insert(1,Node_insert2);
System.out.print("The list after inserting 2 at the first position is : ");
System.out.println(linked_list);
ntangcaiming = linked_list.getCount();
System.out.print("The number of linked elements is : ");
System.out.println(ntangcaiming);
System.out.print("The list after deleting the inserted number 1 is : ");
linked_list.delete(6);
System.out.println(linked_list);
ntangcaiming = linked_list.getCount();
System.out.print("The number of linked elements is : ");
System.out.println(ntangcaiming);
運行結果截圖:
線性結構之鏈表(2)
- 根據要求,我們所選擇的是冒泡排序法,依據要求打印排序過程(這裏只打印元素交換的時候):
冒泡代碼實現如下(有刪減):
public void Bubble_sort(Linked_list_node Head,Linked_list linked_list){
Linked_list_node temp = null, tail = null;
temp = head;
int count=1;
while(temp.next != tail){
while(temp.next != tail){
if(temp.number > temp.next.number){
int temp_number = temp.number;
temp.number = temp.next.number;
temp.next.number = temp_number;
System.out.print("The list sorted by the "+ count + " truly bubbling sort is : ");
System.out.println(linked_list);
System.out.print("The number of linked elements is : " + linked_list.getCount() + "\n" );
count++;
}
temp = temp.next;
}
tail = temp;
temp = head;
}
}
- 相關提交點的代碼:
System.out.println("實驗的第三部分:");
System.out.println("Print only the rounds that have implemented the element exchange:");
linked_list.Bubble_sort(linked_list.head,linked_list);
}
catch (IOException E){
System.out.println("錯誤,指定路徑不存在");
}
運行結果截圖(僅僅展示部分截圖):
- 線性結構之數組(4)
- 根據需要編寫自己的數組類
本次提交點相關代碼如下:
System.out.println("實驗的第一部分:");
System.out.print("Enter some integers and create a linked list:");
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
int ntangcaiming = 0 ;
String[] temp_MyArray = input.split(" ");
Array MyArray = new Array(temp_MyArray);
System.out.print("The elements in the array are: ");
System.out.println(MyArray);
System.out.print("The number of elements in the array is: ");
ntangcaiming = MyArray.size();
System.out.println(ntangcaiming);
System.out.println("實驗的第二部分:");
try {
File file = new File("D:\\huawei\\Javawindows文件","EXP1-First semester of sophomore.txt");
InputStreamReader reader = new InputStreamReader(new FileInputStream(file));
BufferedReader bufferedReader = new BufferedReader(reader);
int[] file_word_temp = new int[2];
String[] file_word = bufferedReader.readLine().split(" ");
file_word_temp[0] = Integer.parseInt(file_word[0]);
file_word_temp[1] = Integer.parseInt(file_word[1]);
System.out.print("The array after 1 is inserted in position 5 is : ");
Array MyArray1 = new Array(MyArray.Array_Insert(4, String.valueOf(file_word_temp[0]))) ;
System.out.println(MyArray1);
System.out.print("The number of elements in the array is: ");
ntangcaiming = MyArray1.size();
System.out.println(ntangcaiming);
System.out.print("The list after inserting 2 at the first position is : ");
Array MyArray2 = new Array(MyArray1.Array_Insert(0, String.valueOf(file_word_temp[1])));
System.out.println(MyArray2);
System.out.print("The number of elements in the array is: ");
ntangcaiming = MyArray2.size();
System.out.println(ntangcaiming);
System.out.print("The array after deleting the inserted number 1 is : ");
Array MyArray3 = new Array(MyArray2.Array_Delete(5));
System.out.println(MyArray3);
System.out.print("The number of elements in the array is: ");
ntangcaiming = MyArray3.size();
System.out.println(ntangcaiming);
- 運行結果截圖:
- 線性結構之數組(5)
- 按照要求,我選擇的是選擇排序法:
- 相關代碼如下:
public String Array_Selection_sort() {
int[] temp_MyArray = new int[MyArray.length];
for (int i = 0 ; i < MyArray.length; i ++){
temp_MyArray[i] = Integer.parseInt(MyArray[i]);
}
String result = "";
for (int i = 0; i < temp_MyArray.length - 1 ; i++){
for (int j = i + 1;j < temp_MyArray.length; j++ ){
if (temp_MyArray[i]<temp_MyArray[j]){
int temp = temp_MyArray[i];
temp_MyArray[i] = temp_MyArray[j];
temp_MyArray[j] = temp;
String every = "";
for (int data : temp_MyArray){
every += data + " ";
}
result += "The list sorted by the SelectSorting is : " + every + "\n" +
"The number of elements in the array is: :" + MyArray.length + "\n";
}
}
}
return result;
}
- 本次提交點的相關代碼(有刪減):
System.out.println("實驗的第三部分:");
System.out.print(MyArray3.Array_Selection_sort());
- 運行結果截圖(僅部分)
返回目錄
測試過程及遇到的問題
- 問題1:
- 解決:
返回目錄
分析總結
- 這是一個全新的內容,與我們原來所學的相關,且更深一層並更接近了我們的生活,雖然項目的開發過程的某些代碼的含義還不能完全明白,但在以後的過程中會逐一認識、了解並掌握。
返回目錄
代碼托管
返回目錄
參考資料
Intellj IDEA 簡易教程
Android開發簡易教程
Android studio項目上傳至oschina(碼雲)教程
返回目錄
20172319 實驗二《樹》實驗報告