一些家庭作业问题: 我需要检查二叉树是否遵循此规则: 在每个节点都有数字,我需要检查这个数字是否大于或等于它下的所有节点。
如果所有树都遵循该规则,则该方法应返回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。
但由于某种原因,代码无效。 我检查了几棵树,它总是假的。 顺便说一下,我必须在递归方法中写这个,不允许改变公共方法签名。
答案 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()));
}