6

これは宿題の質問なので、完全なコードの回答は求めていません。

私は犬のクラスを与えられました

package lab12;

import java.io.Serializable;

public class Dog implements Serializable{

    public Dog[] children;
    public String name;

    public Dog(String name)
    {
        this.name = name;
    }

    @Override
    public String toString()
    {
        return name;
    }

}

そして、その子が配列に格納されているルート ドッグ Spot を含むデータ ファイル。データファイルを開くことができるコードを記述し、ツリー データ構造をステップ実行して、入力名がルート (スポット) の子孫であるかどうかを確認する必要があります。

データファイルを開くことができると確信しています。リンクとして配列を持つノードを作成する構文に苦労しています。私たちの教科書では、左または右にリンクするバイナリ ツリーのみを扱いますが、可変数のリンクにはリンクしません。List アプローチを使用する一般的な例を見つけました。

public class Tree<T> 
{
    private Node<T> root;

    public static class Node<T> 
    {
        private T data;
        private Node<T> parent;
        private List<Node<T>> children;
    }

    public Tree(T rootData) 
    {
        root = new Node<T>();
        root.data = rootData;
        root.children = new ArrayList<Node<T>>();
    }
}

データファイルを使用する必要があるため、ノードの構造を、子を Dog[] に格納する以外に変更することはできません。基本的な配列を使用して子を格納するノード クラスの例が見つかりません。また、これを行うための構文もわかりません。ジェネリックを使用して学習する前に、ジェネリックを使用せずにそれを確認することは、私の理解に役立つと思います。

これまでの私のコードは次のとおりです。

package lab12;

public class DogTree 
{
    //Start Inner Class
    private static class Node
    {
        private String name;
        private Node parent;
        private Node Dog[] children; //This is where I'm confused
    }
    //End Inner Class

    private Node root;

    public DogTree()
    {
        root = null;
    }

    public boolean isDescendant(String name)
    {
        return isInSubtree(name, root);
    }

    private static boolean isInSubtree(String name, Node subTreeRoot)
    {
        if(subTreeRoot == null)
        {
            return false;
        }
        else if(subTreeRoot.name.equals(name))
        {
            return true;
        }
        else
        {
            //This is where my confusion on the 
            //node design causes implementation problems
            return isInSubtree(name, subTreeRoot.children); 
        }
    }
}
4

2 に答える 2

1

子の配列を反復処理する必要があります。

private static boolean isInSubtree(String name, Node subTreeRoot)
    {
        if(subTreeRoot == null)
        {
            return false;
        }
        else if(subTreeRoot.name.equals(name))
        {
            return true;
        }
        else
        {
           for( int i = 0; i< subTreeRoot.children.length();i++)
             if(isInSubtree(name, subTreeRoot.children[i]))
            return true;
        }
        return false;

    }
于 2013-12-23T14:54:21.920 に答える