0

试图在这个 BST 中扎根:

if (currentNode == null) {
            currentNode = new BinaryNode(newInt);
            System.out.println(currentNode);
            System.out.println(newInt);
            //System.out.println(newInt.getValue());
            System.out.println("Node Null, made root");
         }else{

println 用于调试。但是我遇到了问题,因为这是输出:

BinaryNode@7004ba66
4
Node Null, made root
BinaryNode@4669b7fe
6
Node Null, made root
BinaryNode@46aea8cf
1
Node Null, made root
BinaryNode@74ccd249
3
Node Null, made root
BinaryNode@3301f287
2
Node Null, made root
BinaryNode@44d9973a
8
Node Null, made root
BinaryNode@29578426
7  
Node Null, made root
BinaryNode@30a4effe
5
Node Null, made root
BinaryNode@1c8825a5
9
Node Null, made root

这让我觉得它没有像它应该的那样识别 (currentNode == null)。任何想法为什么?

完整的pastebin:这里

非常感谢任何帮助:)

4

2 回答 2

2

问题是,当您分配时currentNoderoot不会被分配。

Java 按值传递变量,这意味着将值或引用的副本传递到您的方法中。在这种情况下,currentNode您的方法的形式参数被传递给该方法返回的字段insertNode的副本。rootgetRoot

要解决此问题,您应该将该insertNode方法一分为二:

public void insert(int newInt);

private BinaryNode insert(int newInt, BinaryNode node);

公共方法应该在没有getRoot参数的情况下使用(插入树中的类的用户永远不需要传递根,否则他们将能够通过在中间传递一个带有数字的节点来破坏你的树,而这些数字应该进入不同的分支)。

私有方法应该返回旧节点或新节点。你应该像这样使用它:

public void insert(int newInt) {
    root = insert(newInt, root);
}

如果node传入的是,方法本身应该返回新节点null。当node不为 null 时,该方法应返回传入的节点。

outputList问题而言,您应该使用StringBuffer而不是String构造输出。与String不可变的不同,它StringBuilder是可变的。它允许您更改其中的字符串(使用append而不是+=)。

于 2013-07-15T10:23:57.043 回答
1

您没有分配给树的根。将其更改为:

if (root== null) {
        root= new BinaryNode(newInt);
于 2013-07-15T10:23:12.270 回答