Java - 如何计算和比较二叉树

时间:2012-02-05 15:41:10

标签: java recursion

一些家庭作业问题: 我需要检查二叉树是否遵循此规则: 在每个节点都有数字,我需要检查这个数字是否大于或等于它下的所有节点。

如果所有树都遵循该规则,则该方法应返回true。 我写了这段代码:

public static boolean isSigma(Node n)
{
    if (n == null)
        return true;
    if (n.getLeftSon() == null && n.getRightSon() == null)
        return true;
    else return n.getNumber() >= sumCalc(n) && isSigma(n.getLeftSon()) && isSigma(n.getRightSon());
}

private static int sumCalc(Node n) // return the sum of specific Node plus other Node/s that are under it
{
    if (n==null)
        return 0;
    else return n.getNumber() + sumCalc(n.getLeftSon()) + sumCalc(n.getRightSon());
}

左侧树将返回false,右侧树将返回true。 enter image description here

但由于某种原因,代码无效。 我检查了几棵树,它总是假的。 顺便说一下,我必须在递归方法中写这个,不允许改变公共方法签名。

3 个答案:

答案 0 :(得分:2)

改述问题:
如果节点数n大于或等于其所有子节点的数量之和,并且其所有子节点也为sigma,则isSigma(Node n)应返回true。

如果这是您正在寻找的,这是您的解决方案:

public static boolean isSigma(Node n)  
{
    if (n == null) {
        return true;
    } else if (n.getLeftSon() == null && n.getRightSon() == null) {
        return true;
    } else if (n.getLeftSon() != null || n.getRightSon() != null) {
        boolean leftIsSigma = isSigma(n.getLeftSon());
        boolean rightIsSigma = isSigma(n.getRightSon());
        int sumOfChildren = sumCalc(n.getLeftSon()) + sumCalc(n.getRightSon());

        return ((n.getNumber() >= sumOfChildren) && leftIsSigma && rightIsSigma);
    }
}

private static int sumCalc(Node n) {
    if (n == null)
        return 0;
    return n.getNumber() + sumCalc(n.getLeftSon()) + sumCalc(n.getRightSon());
}

答案 1 :(得分:1)

不是更好吗? :)

private static int sumCalc(Node n) {
    if (n == null)
        return 0;
    return n.getNumber() + sumCalc(n.getLeftSon()) + sumCalc(n.getRightSon());
}

现在你只需使用sumCalc(rootNode);

你应该修改递归的想法。

...修改

查看此行:

return n.getNumber() >= sumCalc(n) && isSigma(n.getLeftSon()) && isSigma(n.getRightSon());

请记住,sumCalc(n)计算从n节点开始的所有树的值。您真正要在此处查看的内容不是n.getNumber() >= sumCalc(n),而是n.getNumber() >= sumCalc(n) - n.getNumber()等于n.getNumber() << 1 >= sumCalc(n)

答案 2 :(得分:0)

问题是由isSigma()的其他情况下的子句创建的:

   [A]  n.getNumber() >= sumCalc(n)

sumCalc()的定义添加了节点n及其所有子节点及其子节点的权重/值等。干运行代码。 sumCalc(n)将返回子节点的n.getNumber()+ sumCalc()。因此声明[A]将永远是错误的。 (除非你正在处理负值)

修改方法sumCalc(),如下所示:

  private static int sumCalc(Node n) 
  // return the sum of specific Node plus other Node/s that are under it
  {
    if (n==null)
       return 0;
    else 
       int childSum = n.getLeftSon().getNumber() + n.getRightSon().getNumber();
       return (childSum + sumCalc(n.getLeftSon()) + sumCalc(n.getRightSon()));
  }