当前位置: 首页 > 知识库问答 >
问题:

在二叉查找树中使用递归测试方法

阎伟志
2023-03-14

这个toRoot方法应该返回一个列表,其中包含树中参数key和根之间的所有键。我使用了系统。出来类和junit测试方法中的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测试

@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类中被覆盖的add方法

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'<的右子级。/code>。


共有1个答案

郎正平
2023-03-14

您的toRoot方法可能正在向系统打印字符串。out,但它不返回字符串。相反,它返回一个列表。因此,您的断言总是错误的,因为字符串不等于列表

如果您想与String进行比较,那么您需要编写一个函数来转换List

另一种选择是使用Hamcrest风格的匹配器,如包含

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

请注意,尽管有名称,包含进行顺序检查,因此即使键出现故障,该测试也会失败,这将使您之前进行的assertEquals检查具有相同的行为。

 类似资料:
  • 我有一个<code>BinarySearchTree</code>,里面有Instance bankaccount的对象,这是我创建的一个类,所以基本上它只是一个二进制搜索树,我编写了一个方法,它将获取树并对其进行平衡,因为某些原因,它在平衡之前准确地打印出树: 现在,首先我有方法,它接受一个列表和一个并通过按顺序检查树数据来创建树数据的,因此它是一个排序数组。然后使用另一种方法以平衡的方式创建树

  • 我有TreeNode类——非二叉树(

  • 我创造了这个二叉查找树。我使用循环和递归编写了两种形式的插入方法。递归代码虽然看起来是正确的,但并不工作,我想不出问题是什么。当我使用insertRecursion方法创建树时,leftChild和rightChild总是为null。 }

  • 我正在努力解决一个问题二叉树的最大深度-LeetCode 这个问题是在leetcode教程中作为尾递归练习给出的。尾递归-LeetCode 给定一棵二叉树,求其最大深度。 最大深度是从根节点到最远叶节点的最长路径上的节点数。 注意:叶子是没有子节点的节点。 例子: 给定二叉树, 返回其深度=3。 一种标准的解决方案,从级别的定义来看待问题 然而,它不是尾部递归 尾递归是递归,其中递归调用是递归函数

  • 我试图递归地在二叉树中找到最小值(不是二叉查找树)。让我困惑的是基本情况。如果TreeNode t为空,返回什么?因为我将使用返回的值将其与当前的最小值进行比较(我认为),我相信我返回的内容很重要。

  • 我坚持使用递归函数来查找二叉树中节点的深度,更具体地说,是在else条件中: 如果树是二叉搜索树,知道左子值总是低于父值,右子值总是高于父值,我可以添加一个If条件,这样如果节点x值低于根,我总是返回根- 当查看函数时,假设节点总是存在的,节点x永远不是根,并且在开始时传递的深度总是0。 如果树是二叉搜索: