在二叉搜索树中使用递归测试方法

时间:2014-11-06 15:46:21

标签: java recursion binary-search-tree

这个toRoot方法应该返回一个列表,其中包含参数key和根之间树中的所有键。我在类和junit测试方法中都使用了System.out.println语句。为什么两个打印语句的输出不同? toRoot方法中打印的输出是我想要的,但我只在junit测试方法中打印根。我该如何解决这个问题?

public List<K> toRoot(K key) {
        List<K> list=new LinkedList<K>();
        int i = key.compareTo(this.key);
        if(i == 0){
            list.add(this.key);
        }
        else if(i < 0){
            left.toRoot(key);
            list.add(this.key);
        }
        else if(i > 0){
            right.toRoot(key);
            list.add(this.key);
        }   
        System.out.print(list); //prints "i o n p s z i"...these are the desired 
        //outputs of the two assertEquals combined together
        return list;
    }

JUnit Testing

@Test public void testToRoot() {
    Tree<Character, Integer> tree = tree1();
    System.out.print(tree.toRoot('o')); //prints 'i'
    assertEquals("i", tree.toRoot('i'));
    assertEquals("o n p s z i", tree.toRoot('o'));
}
private static Tree<Character, Integer> tree1() {
    Tree<Character, Integer> tree = EmptyTree.getInstance();

    tree= tree.add('i', 1);
    tree= tree.add('z', 2);
    tree= tree.add('e', 3);
    tree= tree.add('s', 4);
    tree= tree.add('p', 5);
    tree= tree.add('n', 6);
    tree= tree.add('b', 7);
    tree= tree.add('h', 8);
    tree= tree.add('o', 9);
    tree= tree.add('f', 10);

    return tree;
}

其他细节: 树类是NotEmptyTree类实现的接口,包括覆盖的toRoot

public NonEmptyTree<K, V> add(K key, V value);

以下是NotEmptyTree

中覆盖的添加方法
public NotEmptyTree<K, V> add(K key, V value) {
        if(key.compareTo(this.key) == 0){
            this.value = value;
        }else if(key.compareTo(this.key) < 0){
            left = left.add(key, value);
        }else{
            right = right.add(key, value);
        }
        return this;    
    }

字母表前面附近的字母小于朝向字母前面的字母。在这种情况下,'i''e''z'的父节点。 'z'的左侧孩子为's',其子女为'p',其子女为'n',其子女为'o''e'已留下'b'的孩子,其中有'h'的正确孩子。

1 个答案:

答案 0 :(得分:0)

您的toRoot方法可能会将字符串打印到System.out,但它不会返回 a String。相反,它返回List。因此,您的断言将始终为假,因为String不等于List

如果要与String进行比较,那么您需要编写一个函数,将List<K>转换为空格分隔的String,然后再调用该函数致电assertEquals

另一种选择是使用像Hamcrest这样的contains式匹配器:

assertThat(tree.toRoot(), contains('o', 'n', 'p', 's', 'z', 'i'));

请注意,尽管有名称,但contains会进行有序检查,因此即使密钥出现故障,此测试也会失败,这会导致assertEquals检查您的行为相同以前正在制作。