Java自定义树节点交换

时间:2012-11-02 05:37:01

标签: java generics tree

我在使用自定义树时遇到了一些麻烦。我正在写一个“学习”动物的程序。让我们从节点开始。我从一个叫做BTNode的课开始。它包含一个字符串值和一个“右”和“左”BTNode。然后我将BTNode扩展为名为DecisionTreeNode的抽象类。 DecisionTreeNode由ThingNode和QuestionNode扩展。 Thing节点仅用于叶节点,其字符串值是动物的名称。 QuestionNode将包含区分动物的问题,并且应始终具有两个子节点。

因此,我们的想法是通过询问用户提供的问题来学习。因此,它将首先简单地要求用户思考一只动物,然后问:“它是否是?”,如果我回答否,它会询问我的答案,以及区分这两者的问题。

例如,我可以用一个thingNode(“mouse”)“播种”树,如果我想到一条鱼,那么我将回答它的第一个问题“no”,然后提出一个问题,“它生活在水中吗?“现在,下一次,它将首先问:“它是否存在于水中?”并且“是”将导致“它是鱼”,而“否”将导致“它是鼠标吗?”。

所以,我将在下面发布我的“学习”方法。我想我有一个引用问题。我将一个DecisionTreeNode传递给了learn方法,但是我对它所做的更改并没有重新级联。不确定我是否正确解释。该方法适用于第一次运行,您将看到我将根节点从Thing更改为Question并将其子节点设置为两个动物的位置。但是这对“当前”(传递给方法的叶节点)不起作用,学习方法的最后一行是没有按预期运行的行。

对于文字墙感到抱歉,如果您想要发布更多代码或任何其他信息,请与我们联系。 提前致谢。

“root”最初传入play方法。

public static void play(DecisionTreeNode current) {
    while(!current.isLeaf()) {
        if(queryUser(current.getValue())) {
            current = current.getYesLink();
        }
        else {

            current = current.getNoLink();
        }
    }
    System.out.println("Is it a " + current.getValue() + "?");
    if(!queryUser("Correct?")) {
        learn(current);
    }
    else {
        System.out.println("I win!");
    }
}




public static void learn(DecisionTreeNode current) {
        String currentGuess;
        String correctGuess;
        String newQuestion;
        ThingNode tempNode;

        currentGuess = current.getValue();
        System.out.println("I give up, what animal were you thinking of?");

        correctGuess = stdin.nextLine();
        System.out.println("Please enter a yes or no question that distinguishes a " + correctGuess + " from a " + currentGuess +": ");

        newQuestion = stdin.nextLine();

        tempNode = (ThingNode)current;
        if(current == root) {
            if(queryUser("")) {
                root = new QuestionNode(newQuestion, tempNode, new ThingNode(correctGuess));
            }
            else {
                root = new QuestionNode(newQuestion, new ThingNode(correctGuess), tempNode);
            }
        }
        else {
            current = new QuestionNode(newQuestion, tempNode, new ThingNode(correctGuess));
        }
    }

1 个答案:

答案 0 :(得分:1)

你的问题在这里:

else {
    current = new QuestionNode(newQuestion, tempNode, new ThingNode(correctGuess));
}

Current是方法的参数。它是对值传递的DecisionTreeNode 的引用。 在此处设置current不会更改传递给方法的current

您可以将current的父级传递给该函数并调整其对current的引用,也可以创建一个replace(Node, Node)方法,您可以调用parent.replace(leaf, createNewLearnedNode(leaf))