[英]getNumberOfInteriorNodes BinaryTree Java
在@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());
}
我的测试在第三个断言处失败,并显示错误。 计数永远不会超过零。 这是我得到的错误:
Failure: junit.framework.AssertionFailedError: expected:<1> but was:<0>
任何进一步的帮助,将不胜感激。
您的问题是,使用递归时只有一个共享的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) {
...
}
这是一些可以解决问题的代码。 顺便说一句:没有孩子的节点是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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.