获取内部节点数二进制树Java

时间:2013-04-09 16:43:27

标签: java binary-tree nodes

在@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>

任何进一步的帮助将不胜感激。

2 个答案:

答案 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);
    }
}