20182320 2019-2020-1「オブジェクト指向プログラミングとデータ構造」実験報告8
コース:「プログラミングとデータ構造」
クラス:1823
名前:鄭李元
学生ID:20182320
王志強:教師実験
実験日:2019年11月11日
必修/選択科目:必修
1.実験の内容
1.1
参考資料のPP16.1、LinkedBinaryTree完全な実現チェーンツリー(GetRightのは、含まれている、のtoString、前順 、後順)
JUnitを用いたか、独自のドライバクラスを記述し、フルスクリーンに、テストコードの実行ショットを提出し、その実施のLinkedBinaryTreeテストのためには、それ自身が含まれています学生のID情報
コードの下には、クラスコードホスティングプラットフォームにプッシュ
1.2
配列およびその後HDIBEMJNAFCKGL ABDHIEJMNCFGKL、図面のツリー構造に与えられたようなベースに基づいLinkedBinaryTree、(順番に、一次)は、2つの機能的構成㕚ツリーのユニーク配列、
それらのライトドライバまたはJUnitのクラスと機能テストの独自の実装では、テストコードの実行ショットは、フルスクリーンに、独自の学生数の情報が含まれて提出する
コードホスティングプラットフォームにプッシュされたコードの下にコース
1.3
独自のデザインとは、決定木を実装する
フルスクリーンに、テストコードの実行ショットを提出し、独自の学生番号情報が含まれている
コードのホスティングプラットフォームにプッシュされたコードの下にコース
1.4
中置式を入力し、後置記法に中置式を変換するために木を使用し、出力後置式と計算(そうでない場合は、ツリー、通常のスコア。あなたは木を使用している場合は、小さな問題があるにもかかわらず、だけでなく、裁量にアウト)
テストコードの実行ショットを提出するには、フルスクリーンに、独自の学生番号情報が含まれています
2.実験の手順と結果
2.1
最初のステップ:本にLinkedBinaryTreeを達成するためにクラスを追加するには、それは完全にLinkedBinaryTreeを実現するために、BinaryTreeインタフェース、ノードクラス、2つの例外クラスを作成する必要があります。
本はArrayIteratorは、ArrayListのを置き換えます以下のコード:
public class LinkedBinaryTree<T> implements BinaryTree<T>
{
protected BTNode<T> root;
public LinkedBinaryTree()
{
root = null;
}
public LinkedBinaryTree (T element)
{
root = new BTNode<T>(element);
}
public LinkedBinaryTree (T element, LinkedBinaryTree<T> left,
LinkedBinaryTree<T> right)
{
root = new BTNode<T>(element);
root.setLeft(left.root);
root.setRight(right.root);
}
public T getRootElement() throws Exception, EmptyCollectionException {
if (root == null)
throw new EmptyCollectionException ("Get root operation "
+ "failed. The tree is empty.");
return root.getElement();
}
public LinkedBinaryTree<T> getLeft() throws Exception, EmptyCollectionException {
if (root == null)
throw new EmptyCollectionException ("Get left operation "
+ "failed. The tree is empty.");
LinkedBinaryTree<T> result = new LinkedBinaryTree<T>();
result.root = root.getLeft();
return result;
}
public T find (T target) throws ElementNotFoundException {
BTNode<T> node = null;
if (root != null)
node = root.find(target);
if (node == null)
throw new ElementNotFoundException("Find operation failed. "
+ "No such element in tree.");
return node.getElement();
}
//返回大小
public int size()
{
int result = 0;
if (root != null)
result = root.count();
return result;
}
public LinkedBinaryTree<T> getRight() throws Exception, EmptyCollectionException {
if (root == null)
throw new EmptyCollectionException ("Get left 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 false;
}
else {
return true;
}
}
public boolean isEmpty() {
if (root==null){
return true;
}
else {
return false;
}
}
//先序遍历
public ArrayList<T> preorder() {
ArrayList<T> iter = new ArrayList<T>();
if (root != null)
root.preorder (iter);
return iter;
}
//后续遍历
public ArrayList<T> postorder() {
ArrayList<T> iter = new ArrayList<T>();
if (root != null)
root.postorder (iter);
return iter;
}
public String toString() {
return super.toString();
}
}
ステップ2:書き込みテストコード、実行
2.2
ステップ:LinkedBinaryTreeは、上記の方法を変更し、第一の配列、配列と後順トラバースは、トップダウン法は二分木構造に参加することができながら、文字列を返すように変更されています。
public int findIndexInArray(char[] a, char x, int begin, int end) {
for(int i=begin;i<=end;i++) {
if(a[i] == x) {
return i;
}
}
return -1;
}
public void initTree(char[] preOrder, char[] inOrder) {
this.root = this.initTree(preOrder, 0, preOrder.length-1, inOrder, 0, inOrder.length-1);
}
public BTNode initTree(char[] preOrder, int start1, int end1, char[] inOrder, int start2, int end2) {
if(start1 > end1 || start2 > end2) {
return null;
}
//通过前序找到根结底
char rootData = preOrder[start1];
BTNode<Character> head = new BTNode(rootData);
//从中序遍历里找到根结点所在的位置
int rootIndex = findIndexInArray(inOrder, rootData, start2, end2);
//offSet代表左子树的长度-1(也就是中序遍历中,左子树最后一个元素的下标)
int offSet = rootIndex - start2 - 1;
//递归构建左子树
BTNode left = initTree(preOrder, start1+1, start1+1+offSet, inOrder, start2, start2+offSet);
//递归构建右子树
BTNode right = initTree(preOrder, start1+offSet+2, end1, inOrder, rootIndex+1, end2);
head.left = left;
head.right = right;
return head;
}
ステップ2:書き込みテストコード、その後のビルドバイナリツリートラバーサルテストの正常かどうかをここで実行します
2.3
最初のステップ:(mainメソッドおよび方法は、決定木の構造と動作を含む)の良好な決定木のノードクラスとクラスを作成
public static void buildDTree(){
root=new BTNode("大力帅吗?y/n");
BTNode<String> temp=root;
temp.left=new BTNode<>("你错了。");
temp.right=new BTNode<>("大力聪明吗?y/n");
temp=temp.right;
temp.left=new BTNode<>("你错了。");
temp.right=new BTNode<>("大力强吗?y/n");
temp=temp.right;
temp.left=new BTNode<>("你错了。");
temp.right=new BTNode<>("你说的都对了。");
}
public static void runDTree(BTNode root){
System.out.println(root.element);
if (root.left==null||root.right==null){
return;
}
while (true){
stringTokenizer=new StringTokenizer(scanner.nextLine());
String string=stringTokenizer.nextToken();
if (string.equals("y")){
runDTree(root.right);
break;
}
else if (string.equals("n")){
runDTree(root.left);
break;
}
else {
System.out.println("输入错误!重新输入。");
}
}
}
ステップ2:実行
2.4
最初のステップ:(mainメソッドを含む)、共役転写サフィックスクラスの調製:
public static String infixToSuffix(String infix) {
Stack<Character> stack = new Stack<Character>();
String suffix = "";
int length = infix.length();
for (int i = 0; i < length; i++) {
Character temp;
char c = infix.charAt(i);
switch (c) {
// 忽略空格
case ' ':
break;
// 碰到'(',push到栈
case '(':
stack.push(c);
break;
// 碰到'+''-',将栈中所有运算符弹出,送到输出队列中
case '+':
case '-':
while (stack.size() != 0) {
temp = stack.pop();
if (temp == '(') {
stack.push('(');
break;
}
suffix += " " + temp;
}
stack.push(c);
suffix += " ";
break;
// 碰到'*''/',将栈中所有乘除运算符弹出,送到输出队列中
case '*':
case '/':
while (stack.size() != 0) {
temp = stack.pop();
if (temp == '(' || temp == '+' || temp == '-') {
stack.push(temp);
break;
} else {
suffix += " " + temp;
}
}
stack.push(c);
suffix += " ";
break;
// 碰到右括号,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号
case ')':
while (stack.size() != 0) {
temp = stack.pop();
if (temp == '(')
break;
else
suffix += " " + temp;
}
// suffix += " ";
break;
//如果是数字,直接送至输出序列
default:
suffix += c;
}
}
//如果栈不为空,把剩余的运算符依次弹出,送至输出序列。
while (stack.size() != 0) {
suffix += " " + stack.pop();
}
return suffix;
}
ステップ2:実行
3.実験過程で発生した問題や決済処理
質問1:
もともと二分木構造に基づくLinkedBinaryTree方法、8.2のビルド完全なバイナリツリーはたかったが、LinkedBinaryTree元のバイナリツリー構造のボトムアップ工法は、しかし、知られている先行順走査順序であるとのルートを決定することができるましたバイナリツリーのトップ
この問題を解決するために1:
バイナリツリーのトップダウン、機能を構築する独自のメソッドを追加します。
その他(知覚、思考、など)
今回は木だけでなく、決定木を構築するために、憲法の前文で、ツリーの建設に関連するツリーとその特性に主に実験しなければなりません。ターンサフィックスツリー構造で装飾が私が最終的に達成することはできませんが、この困難を達成するためにまだ小さいではありません、それはスタックとキュー線形構造の2つの種類を通じてより多くの時間がかかります。これらのプログラミング手法は、私たちは、古典的なデータ構造のいくつかのより深い理解を得ることができます。