Java - Trees,返回arrayList中的最大节点数

时间:2017-05-09 04:00:01

标签: java

我被困在我的一个关于树木的大学实验室,并希望有人可以帮我解决这个问题。他们要求我们编写一个名为maxDegree()的方法,该方法返回任何节点的最大子节点数。我正在努力弄清楚如何实现这一点,如果有人能够看到我当前的方法并指出我正确的方向,这将是伟大的!

示例树图 - http://imgur.com/eGqDpf2l.png

package week10;

import java.util.*;

/**
 * Skeleton of the recursive implementation of a general tree.
 * 
 * @author Michael Albert
 * @param <T> The type of values stored in the tree.
 */
public class Tree<T> {

    private T rootValue;
    private List<Tree<T>> children;

    public Tree(T rootValue, List<Tree<T>> children) {
        this.rootValue = rootValue;
        this.children = children;
    }

    public Tree(T rootValue) {
        this(rootValue, new ArrayList<Tree<T>>());
    }

    public int size() {
        int count = 1;
        for (Tree<T> child : children) {
            count += child.size();
        }
        return count;
    }

    //METHOD I AM STUCK ON
    public int maxDegree() {
        int largestNode = 0;
        for (Tree<T> child : children) {
            child.maxDegree();
            if (child.size() > largestNode) {
                System.out.println("test" + children.size());
                largestNode = child.size();
            }
        }
        return largestNode;
    }

    public void add(Tree<T> child) {
        children.add(child);
    }

    public Tree<T> find(T value) {
        if (rootValue.equals(value)) {
            return this;
        }
        for (Tree<T> child : children) {
            Tree<T> match = child.find(value);
            if (match != null) {
                return match;
            }
        }
        return null;
    }

    public List<T> postOrder() {
        // implement this method
        return new ArrayList<T>();
    }

    public String toString() {
        if (children.isEmpty()) {
            return rootValue.toString();
        }
        return rootValue.toString() + ' ' + children.toString();
    }

    public String toIndentedString() {
        // implement this method
        return "Not implemented yet!";
    }

    /** A helper method for testing (used by main).  Searches tree for
     *  the given target and adds white space separated children to
     *  the tree matching target if there is one.
     *
     * @param target the root value to seach for.
     * @param children a white space separated list of children to add
     * to the tree whose value matches target.
     */
    private static void addChildren(String target, String children) {
        Tree<String> parent = tree.find(target);
        if (parent != null) {
            for (String child : children.split(" ")) {
                parent.add(new Tree<>(child));
            }
        }
    }

    /** A tree instance used for testing. */
    private static Tree<String> tree;

    /**
     * Entry point of the program (used for testing).
     *
     * @param args command line arguments are not used.
     */
    public static void main(String[] args) {
        System.out.println("Creating tree\n-------------");
        tree = new Tree<>("food");
        System.out.print(tree + "\nsize: " + tree.size());
        System.out.println(", max degree: " + tree.maxDegree());
        System.out.println("\nAdding children\n----------------");
        addChildren("food", "meat fruit vegetable");
        System.out.print(tree + "\nsize: " + tree.size());
        System.out.println(", max degree: " + tree.maxDegree());
        System.out.println("\nAdding deeper children\n----------------------");
        addChildren("meat", "chicken beef fish");
        addChildren("fish", "salmon cod tuna shark");
        addChildren("vegetable", "cabbage");
        System.out.print(tree + "\nsize: " + tree.size());
        System.out.println(", max degree: " + tree.maxDegree());
        System.out.println("\nPostorder\n---------");
        System.out.println(tree.postOrder());
        System.out.println("\nIndented string\n---------------");
        System.out.print(tree.toIndentedString());
    }

}

1 个答案:

答案 0 :(得分:1)

这将有效:

public int maxDegree()
{
    // Get the number of immediate children
    int numChildren = this.children.size();

    // Find the max of all children
    int maxOfChildren = 0;
    for (Tree<T> child : children)
    {
        maxOfChildren = Math.max(maxOfChildren, child.maxDegree());
    }

    // return the greater of immediate child or max of children
    return Math.max(numChildren, maxOfChildren);
}

示例树的说明

  1. 在食物节点上调用最大程度(它有3个直接的孩子)
  2. 我们遍历所有食物的孩子(肉,水果,蔬菜)
  3. 在肉节点上调用最大度数(它有3个直接孩子)
  4. 我们遍布所有肉类(鸡肉,牛肉,鱼肉)
  5. 在鸡节点上调用最大度数(它有0个直接孩子)
  6. 鸡的最大程度为0
  7. 在牛节上调用最大度数(它有0个直接孩子)
  8. 最大牛肉度为0
  9. 在鱼节点上调用最大度数(它有4个直接的孩子)
  10. 我们遍布所有鱼类(鲑鱼,鳕鱼,金枪鱼,鲨鱼)
  11. 在鲑鱼节点上调用最大度数(它有0个直接孩子)
  12. 鲑鱼的最大程度为0
  13. 在鳕鱼节点上调用最大度数(它有0个直接孩子)
  14. 最大鳕鱼度为0
  15. 在金枪鱼节点上调用最大度数(它有0个直接孩子)
  16. 最大金枪鱼度为0
  17. 在鲨鱼节点上调用最大度数(它有0个直接子节点)
  18. 鲨鱼最大程度为0
  19. 所有鱼儿的最大度数为0
  20. 鱼的最大程度为4
  21. 所有儿童的最大程度为4
  22. 最大肉程度为4
  23. 在水果节点上调用最大度数(它有0个直接孩子)
  24. 最大果实度为0
  25. 在蔬菜节点上调用最大学位(它有1个直接孩子)
  26. 我们遍布蔬菜的所有孩子(白菜)
  27. 在卷心菜节点上调用最大度数(它有0个直接孩子)
  28. 甘蓝的最大度为0
  29. 所有蔬菜儿童的最大程度为0
  30. 蔬菜的最大程度为1
  31. 所有食物儿童的最大程度为4
  32. 最大食物量为4