二叉搜索树,中序横向 return 泛型数组

Binary Search Tree, In-order transversal return generic array

public class Bst<E extends Comparable<E>> {

private BstNode<E> root;

    public Bst(E data) {
       root = new BstNode<>(data);
    }

    public void add(E data) {
        root = arr(data,root);
    }

    private BstNode<E> add(E data, BstNode<E> startNode) {
        if (startNode == null) {
            startNode = new BstDupNode<>(data);
        } else if (data.compareTo(startNode.data) < 0) {
            startNode.left = add(data, startNode.left);
        } else {
            startNode.right = add(data, startNode.right);
        }
        return startNode;
    }
   
    public E[] getAllData(E[] template) {
        index = 0;
        inorderTraversal(template, root, index);
        return template;
    }

    private int index;

    private void inorderTraversal(E[] template, BstNode<E> startNode, int index) {
        if (startNode != null) {
            inorderTraversal(template,startNode.left, index);
            template[index++] = startNode.data;
            inorderTraversal(template, startNode.right, index);
        }
    }


    private static class BstNode<E extends Comparable<E>> {
        public int count;
        public E data;
        public BstNode<E> left , right;

        public BstDupNode(E data) {
            this.data = data;
            left = right = null;
        }
    }

    public static void main(String[] args) {
        Bst<Integer> hello = new BstDup<>(7);
        hello.add(8);
        hello.add(3);
        hello.add(1);
        hello.add(6);
        hello.add(4);
        hello.add(10);
        hello.add(14);
   }
}

我得到的结果类似于

[7, 8, 10, 14, null, null, null, null, null, null, null]

不知道为什么时不时会把索引归零。因为既然我设置了全局变量,它就应该随着隐居的继续而不断计数,或者至少我是这么认为的。我想了解到底不只是回答,如果你能提供一些解释,我将不胜感激。谢谢。

Java 使用 pass-by-value,这意味着方法获取其参数的 values,但是这些与来电者的副本分开;因此,当您重新分配方法参数时,调用者看不到该重新分配。

比如这样的方法:

void increment(int i) {
    ++i;
}

没有任何效果:该方法递增其 i 的副本,但没有使用该副本。

在你的情况下,问题是你的 inorderTraversal 方法按值获取参数 index - 所以它有自己的副本 - 然后它递增该副本,这很好,但是它的调用者永远不会看到这种变化。

要解决此问题,我建议使用 inorderTraversal return 更新后的 index:

    private int inorderTraversal(E[] template, BstNode<E> startNode, int index) {
        if (startNode != null) {
            index = inorderTraversal(template,startNode.left, index);
            template[index++] = startNode.data;
            index = inorderTraversal(template, startNode.right, index);
        }
        return index;
    }