20182320 2019-2020-1「オブジェクト指向プログラミングとデータ構造」実験報告8

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つの種類を通じてより多くの時間がかかります。これらのプログラミング手法は、私たちは、古典的なデータ構造のいくつかのより深い理解を得ることができます。

参考資料

おすすめ

転載: www.cnblogs.com/leonzheng/p/11869422.html