输出不正确:使用Java实现二进制搜索树

时间:2017-06-17 15:52:13

标签: java binary-search-tree

我是Java的新手,我一直在尝试实现BST,但程序只输出最后插入的值。我的root_node指向的是什么?以下是Tree.javaNode.java的源代码。

Tree.java

public class Tree {

    private Node root_node;

    public void Tree() {
        this.root_node = null;
    }

    public void insertNode (int value) {

        root_node = insertNode(root_node, value);
    }

    public Node insertNode (Node node, int insert_value) {

        if (node == null) {
            return (new Node(insert_value));
        }
        else {
            if (node.getNodeValue() < insert_value)
                node = insertNode(node.getLeftNode(), insert_value);
            else
                node = insertNode(node.getRightNode(), insert_value);

            return (node);
        }
    }

    public void printNode () {

        printNode(root_node);
    }

    public void printNode (Node node) {

        if (node != null){

            System.out.print(node.getNodeValue() + " ");

            printNode(node.getLeftNode());
            printNode(node.getRightNode());
        }
    }

    public static void main(String[] args) {

        Tree tree = new Tree();

        tree.insertNode(54);
        tree.insertNode(87);
        tree.insertNode(11);
        tree.insertNode(25);

        tree.printNode();
    }
}

Node.java

public class Node {

    private int node_value;

    private Node left_node, right_node;

    public Node(int root_value) {

        this.node_value = root_value;

        this.left_node = null;
        this.right_node = null;

    }

    public int getNodeValue() { return (this.node_value); }

    public Node getLeftNode() { return (this.left_node); }

    public Node getRightNode() { return (this.right_node); }
}

错误是我的源代码只显示最后插入的no。在这种情况下,这是25。

3 个答案:

答案 0 :(得分:1)

似乎发生了这样的错误:

您使用第一次调用创建root_node(应遵循java约定称为rootNode)。 然后你调用getLeftNode或getRightNode,但那些不存在,所以我猜他们会返回null

        if (node.getNodeValue() < insert_value)
            node = insertNode(node.getLeftNode(), insert_value);
        else
            node = insertNode(node.getRightNode(), insert_value);

在第二次调用时返回null。

现在你的root_node再次为空,结果是你只有最后插入的值等等。所以这似乎是你的代码只在你调用print时返回最后一个节点值的原因。 / p>

答案 1 :(得分:1)

insertNode的实施不正确。 您始终使用以下方法调用此方法:

root_node = insertNode(root_node, value);

然后,如果你看一下这个方法:

if (node == null) {
    return (new Node(insert_value));
}
else {
    if (node.getNodeValue() < insert_value)
        node = insertNode(node.getLeftNode(), insert_value);
    else
        node = insertNode(node.getRightNode(), insert_value);

    return (node);
}

在第一次通话时,第一个if条件将匹配, 将创建一个新节点并将其分配给呼叫者中的root_node

但是, 在随后的电话中,会发生什么? 第一个if不匹配,因此将else块。 但是之后, 两个分支都重新分配方法的 node参数。 因此else方法的效果将保留在insertNode方法中,因此不会添加任何其他值。

除了重写insertNode方法之外, 你也需要其他的改变。 例如, 目前无法设置或修改节点的左右节点。 您需要通过setter或构造函数为此添加一些方法。

例如,添加了适当的setter后,这将起作用:

  public Node insertNode(Node node, int insert_value) {
    if (node == null) {
      return new Node(insert_value);
    }
    if (node.getNodeValue() < insert_value) {
      node.setLeftNode(insertNode(node.getLeftNode(), insert_value));
    } else {
      node.setRightNode(insertNode(node.getRightNode(), insert_value));
    }
    return node;
  }

答案 2 :(得分:1)

Tree课程中,mehtod public Node insertNode (Node node, int insert_value)不正确,请大声这样说:

        if (node.getNodeValue() < insert_value) {
            Node left = insertNode(node.getLeftNode(), insert_value);
            node.left_node = left;
        }

        else {
            Node right = insertNode(node.getRightNode(), insert_value);
            node.right_node=right;
        }

您应该将insertNode返回的新节点保存到左子节点字段或右子节点字段中,如果不是,printNode将只打印root节点return,因为root节点的左或右子节点为null