Java 在N元树中查找最大平均分数

Java 在N元树中查找最大平均分数,java,algorithm,data-structures,tree,Java,Algorithm,Data Structures,Tree,我想显示n元树的最大平均分数,其中average=子节点值之和/子节点数。 我的节点定义如下 class NaryNode { int value; NaryNode parent; List<NaryNode> children = new ArrayList<NaryNode>(); NaryNode(int x) { this.value = x; } public void addChild(NaryNode childNode) { chil

我想显示n元树的最大平均分数,其中average=子节点值之和/子节点数。 我的节点定义如下

class NaryNode {
int value;
NaryNode parent;
List<NaryNode> children = new ArrayList<NaryNode>();

NaryNode(int x) {
    this.value = x;
}

public void addChild(NaryNode childNode) {
    childNode.parent = this;
    this.children.add(childNode);
  }

}


public class NaryTree {
public NaryNode root = new NaryNode(10);

public NaryTree() {
    root.parent = null;
}

public void traverseTree(NaryNode rootNode)// depth first
{
    System.out.println(rootNode.value);
    if (rootNode.children.size() != 0)
        for (NaryNode ch : rootNode.children)
            traverseTree(ch);
}

public static void main(String[] args) {
    NaryTree mytree = new NaryTree();

    NaryNode n2 = new NaryNode(20);
    NaryNode n3 = new NaryNode(3);
    NaryNode n4 = new NaryNode(15);

    NaryNode n5 = new NaryNode(8);
    NaryNode n6 = new NaryNode(45);
    NaryNode n7 = new NaryNode(22);

    NaryNode n8 = new NaryNode(11);
    NaryNode n9 = new NaryNode(16);
    NaryNode n10 = new NaryNode(18);

    NaryNode n11 = new NaryNode(7);

    mytree.root.addChild(n2);
    mytree.root.addChild(n3);
    mytree.root.addChild(n4);

    n2.addChild(n5);
    n2.addChild(n6);
    n2.addChild(n7);

    n3.addChild(n8);
    n3.addChild(n9);
    n3.addChild(n10);

    n4.addChild(n11);

    // mytree.traverseTree(mytree.root);
    int max = Integer.MIN_VALUE;
    int maxavg = calculateaverage(mytree.root,max);
    System.out.println(maxavg);
}

private static int calculateaverage(NaryNode root,int max) {
    int sum = 0;
    int count =0;
    if(root.children.size() == 0)
        return root.value;
    for(NaryNode cc : root.children){
        sum += calculateaverage(cc,max);
        count++;
    }
    sum = sum/count;
    if(sum>max)
        max = sum;
    return max;
}

 }
类NaryNode{
int值;
纳利诺德亲本;
List children=new ArrayList();
NaryNode(int x){
这个值=x;
}
public void addChild(NaryNode childNode){
childNode.parent=这个;
this.children.add(childNode);
}
}
公共类鸣笛树{
公共NaryNode根=新的NaryNode(10);
公共纳瑞树(){
root.parent=null;
}
public void traverseTree(NaryNode rootNode)//深度优先
{
System.out.println(rootNode.value);
if(rootNode.children.size()!=0)
for(NaryNode ch:rootNode.children)
横贯线(ch);
}
公共静态void main(字符串[]args){
NaryTree mytree=新建NaryTree();
NaryNode n2=新的NaryNode(20);
NaryNode n3=新的NaryNode(3);
NaryNode n4=新的NaryNode(15);
NaryNode n5=新的NaryNode(8);
NaryNode n6=新的NaryNode(45);
NaryNode n7=新的NaryNode(22);
NaryNode n8=新的NaryNode(11);
NaryNode n9=新的NaryNode(16);
NaryNode n10=新的NaryNode(18);
NaryNode n11=新的NaryNode(7);
mytree.root.addChild(n2);
mytree.root.addChild(n3);
mytree.root.addChild(n4);
n2.addChild(n5);
n2.addChild(n6);
n2.addChild(n7);
n3.addChild(n8);
n3.addChild(n9);
n3.addChild(n10);
n4.addChild(n11);
//mytree.traverseTree(mytree.root);
int max=整数的最小值;
int maxavg=calculateaverage(mytree.root,max);
系统输出打印项次(最大平均值);
}
私有静态int-calculateaverage(NaryNode根,int-max){
整数和=0;
整数计数=0;
if(root.children.size()==0)
返回root.value;
for(NaryNode cc:root.children){
总和+=计算范围(cc,最大值);
计数++;
}
总和=总和/计数;
如果(总和>最大值)
最大值=总和;
返回最大值;
}
}

我写了下面的逻辑,但它给了我错误的答案,因为我的逻辑是不正确的。你能指出我错在哪里吗???

你必须为每个有孩子的孩子更新你的
max
值。试试这个:

private static int calculateaverage(NaryNode root,int max) {
    int sum = 0;
    int count =0;
    if(root.children.size() == 0)
        return root.value;
    for(NaryNode cc : root.children){
        if(cc.children.size() > 0){
            int tmp = calculateaverage(cc,max);
            if(tmp>max){
                max = tmp;
            }
        }
        sum+=cc.value;
        count++;
    }
    sum = sum/count;
    if(sum>max)
        max = sum;
    return max;
}

注意:你可能想用
双倍的
来表示平均值。

@Vinny你为什么收回我的答案?现在是你要找的吗?如果没有,请添加更多详细信息,以便我可以改进答案。:-实际上,替换NaryNode n3=新的NaryNode(3);带NaryNode n3=新的NaryNode(3000);检查一下。答案仍然是25。我想这只是检查最后一级