繁体   English   中英

getNumberOfInteriorNodes BinaryTree Java

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM