在@hyde告诉我之后,这就是我所做的:
Node<E> current = root;
int count = 0;
public int getNumberOfInteriorNodes() {
if (current == null || (current.left == null && current.right == null)) {
return count;
}
else {
if (current.right != null) {
Node<E> tmp = current;
current = current.right;
count += getNumberOfInteriorNodes();
current = tmp;
}
if (current.left != null) {
Node<E> tmp = current;
current = current.left;
count += getNumberOfInteriorNodes();
current = tmp;
}
return count + 1;
}
}
以下是我的测试方法:
public static void testGetNumberOfInteriorNodes() {
BinarySearchTree<Integer> t;
t = new BinarySearchTree<Integer>();
Assert.assertEquals(0, t.getNumberOfInteriorNodes());
t.add(2);
Assert.assertEquals(0, t.getNumberOfInteriorNodes());
t.add(1);
Assert.assertEquals(1, t.getNumberOfInteriorNodes());
t.add(5);
Assert.assertEquals(1, t.getNumberOfInteriorNodes());
t.add(4);
Assert.assertEquals(2, t.getNumberOfInteriorNodes());
t.add(3);
Assert.assertEquals(3, t.getNumberOfInteriorNodes());
t.add(6);
Assert.assertEquals(3, t.getNumberOfInteriorNodes());
}
我的测试在第3次断言时因错误而失败。伯爵永远不会超过零。这是我得到的错误:
Failure: junit.framework.AssertionFailedError: expected:<1> but was:<0>
任何进一步的帮助将不胜感激。
答案 0 :(得分:1)
您的问题是,在使用递归时,您只有一个共享current
变量。它将在递归调用中被覆盖。相反,您必须将其作为参数传递,因此您的递归函数必须是:
public int getNumberOfInteriorNodes(Node<E> current)
在第一次调用(代码中的其他位置)上,您将root
传递给它:
... = getNumberOfInteriorNodes(root);
然后你需要在递归调用中传递修改后的值,对于右侧:
count += getNumberOfInteriorNodes(current.right);
左侧也一样,自然而然。这里没有return
,否则它将返回而不计算另一方!也没有+1,如果左右两侧都存在,那么它将是+2。相反,在方法结束时return count + 1;
(是的,你确实需要它)。
此外,在您的第一个if
中,没有点测试root == null
,它没有做任何有用的事情(在这种情况下没有任何危害,但它仍然是混乱的使代码更难理解,如果更改代码可能会成为一个问题。)
然后你似乎也有这个:int count==0;;
这甚至是编译,还是复制粘贴错误?您应该使用作业int count = 0;
如果您没有该方法的参数,则需要在通话后恢复current
的值。这是右侧的代码,左侧也是如此:
if (current.right!=null) {
Node<E> tmp = current;
current = current.right;
count += getNumberOfInteriorNodes();
current = tmp;
}
请注意,对于“真实”代码,这将是一种非常愚蠢的递归方式。
如果这个“无参数”只是API限制,那么通常的解决方法是使用私有帮助器方法:
public int getNumberOfInteriorNodes() {
return recNumberOfInteriorNodes(root)
}
private int recNumberOfInteriorNodes(Node<E> current) {
...
}
答案 1 :(得分:0)
这是一些可以解决问题的代码。顺便说一句:没有孩子的节点是leaves
。
class Node {
Node left;
Node right;
}
class Main {
void test() {
Node root = new Node();
Node leftleft = new Node();
Node left = new Node();
Node right = new Node();
Node rightright = new Node();
Node rightleft = new Node();
root.left = left;
root.right = right;
left.left = leftleft;
right.left = rightleft;
right.right = rightright;
int c = getLeaves(root);
}
int getLeaves(Node node) {
if (node == null)
return 0;
if (node.left == null && node.right == null)
return 1;
return getLeaves(node.left) + getLeaves(node.right);
}
}