Java 二叉搜索树强制我用数字输入0

Java 二叉搜索树强制我用数字输入0,java,Java,我不知道为什么程序强制在树中输入“0”,并将其与其他输入的数字一起排序。它需要构造函数中的输入,我不希望它需要输入 另外,当用户输入一行像“1 2 3 2 4”这样的整数时,如何检查重复项?如何从整数行中删除特定的整数 每次用户输入一些数字时,我的数字集都会附加“0” 建造商: public BinarySearchTree(int num) { this.data = num; this.left = null; this.right = null; }

我不知道为什么程序强制在树中输入“0”,并将其与其他输入的数字一起排序。它需要构造函数中的输入,我不希望它需要输入

另外,当用户输入一行像“1 2 3 2 4”这样的整数时,如何检查重复项?如何从整数行中删除特定的整数

每次用户输入一些数字时,我的数字集都会附加“0”

建造商:

public BinarySearchTree(int num) {  
    this.data = num;    
    this.left = null;
    this.right = null;
}
添加节点:

        public void addNode(int num) {

        if (num < this.data) {
            if (this.left != null) {
                this.left.addNode(num);
            }       else {
                this.left = new BinarySearchTree(num);
            }

}       else {
        if (this.right != null) {
            this.right.addNode(num);
}       else {
            this.right = new BinarySearchTree(num);
}

}
}
主要内容:

预期: 预购:1

实际:
预排序:0 1//始终放置0

构造函数用于初始化类。您需要修改构造函数。编写
BinarySearchTree=newbinarysearchtree(0)它还将值“0”插入到二进制搜索树中。因为0也是树的一部分,所以您将看到0和其他数字。

构造函数中,您期望的是
int num
,如果您没有在
main
类中提供它,它将通过一个错误。因此,您需要做的是明确地定义一个
无参数构造函数
,如下所示:

public BinarySeacrhTree(){}
  BinarySearchTree tree = new BinarySearchTree();
现在在主类中创建如下对象:

public BinarySeacrhTree(){}
  BinarySearchTree tree = new BinarySearchTree();
现在,说到重复问题,在我看来,不要担心有多少重复的用户输入,您的
addNode()
应该处理它

如果值小于
currentNode
请在左侧插入

如果值大于
currentNode
请在右侧插入

如果值等于
currentNode
则不执行任何操作

第三点是注意你的要求。如果你需要其他的帮助,或者是谁来帮助你,尽管问吧,我是来帮助你的

更新: 以下代码将清除您的所有困惑,我故意添加了重复值:

class TreeNode
{
    TreeNode leftNode;
    TreeNode rightNode;
    int data;
    
    public TreeNode(int nodeData)
    {
        data = nodeData;
        leftNode = rightNode = null;
    }
    
    public void insert(int insertValue)
    {
        if(insertValue < data)
        {
            if(leftNode == null)
                leftNode = new TreeNode(insertValue);
            else
                leftNode.insert(insertValue);
        }
        else if(insertValue > data)
        {
            if(rightNode == null)
                rightNode = new TreeNode(insertValue);
            else
                rightNode.insert(insertValue);
        }
        else{}   // if duplicate then do nothing

    }
}

class Tree
{
    public TreeNode root;
    public Tree()
    {
        root = null;
    }
    
    public void insertNode(int insertValue)
    {
        if(root == null)
            root = new TreeNode(insertValue);
        else
            root.insert(insertValue);
    }
    
    public void preOrder()
    {
        preorder(root);
    }
    
    public void preorder(TreeNode node)
    {
        if(node == null)
            return;
        System.out.printf(" %s",node.data);
        preorder(node.leftNode);
        preorder(node.rightNode);
    }
    
    public void inOrder()
    {
        inorder(root);
    }
    
    public void inorder(TreeNode node)
    {
        if(node == null)
            return;
    
        inorder(node.leftNode);
        System.out.printf(" %s",node.data);
        inorder(node.rightNode);
    }
    
    public void postOrder()
    {
        postorder(root);
    }
    
    public void postorder(TreeNode node)
    {
        if(node == null)
            return;
        
        postorder(node.leftNode);
        postorder(node.rightNode);
        System.out.printf(" %s",node.data);
    }   
}

public class stackMainTree
{
    public static void main(String[] args)
    {
        Tree tree = new Tree();
        tree.insertNode(1);
        tree.insertNode(8);
        tree.insertNode(7);
        tree.insertNode(5);
        tree.insertNode(13);
        tree.insertNode(13);
        
        tree.inOrder();
    }
}
类树节点
{
树节点左节点;
树节点右节点;
int数据;
公共树节点(int nodeData)
{
数据=节点数据;
leftNode=rightNode=null;
}
公共void插入(int insertValue)
{
如果(插入值<数据)
{
if(leftNode==null)
leftNode=新树节点(insertValue);
其他的
leftNode.insert(insertValue);
}
else if(插入值>数据)
{
if(rightNode==null)
rightNode=新树节点(insertValue);
其他的
rightNode.insert(insertValue);
}
否则{}//如果重复,则不执行任何操作
}
}
类树
{
树根;
公树()
{
root=null;
}
公共void insertNode(int insertValue)
{
if(root==null)
根=新树节点(插入值);
其他的
root.insert(insertValue);
}
公共无效预订单()
{
前序(根);
}
公共空预订单(树节点)
{
if(node==null)
返回;
System.out.printf(“%s”,节点数据);
前序(node.leftNode);
前序(node.rightNode);
}
公共无效序()
{
顺序(根);
}
公共无效索引(树节点)
{
if(node==null)
返回;
顺序(node.leftNode);
System.out.printf(“%s”,节点数据);
顺序(node.rightNode);
}
公众邮购无效()
{
后序(根);
}
公共作废邮购(TreeNode节点)
{
if(node==null)
返回;
postorder(node.leftNode);
postorder(node.rightNode);
System.out.printf(“%s”,节点数据);
}   
}
公共类StackMain树
{
公共静态void main(字符串[]args)
{
树=新树();
插入节点(1);
插入节点(8);
插入节点(7);
插入节点(5);
插入节点(13);
插入节点(13);
tree.inoorder();
}
}

现在,测试并尝试了解您是如何处理的,以及应该如何处理,并充分利用OOP。

您显示的“BinarySearchTree”类显然在树中定义了一个节点,并且每个这样的节点都有一个数据值。没有它,您无法构造节点。插入的第一个节点成为根节点,在您的情况下,该节点的值为零。谁定义了这个类?“为什么程序强制…”->因为它是这样编码的,所以你必须问作者为什么他会这样编程。她/他可以读取第一个值并使用它而不是
0
来创建树。但是我需要为BinarySearchTree(int-num)包含一个输入,因为我需要在将来的方法中使用它。。。有什么方法可以更改这些方法,以便在我更改为BinarySearchTree()时它们不会出错吗?当然可以,但为此,我还必须查看您正在讨论的那些方法。您的修改应该可以。。。在问题中放置
addNode()
方法。我想我必须改变一下,这些打印方法不需要任何改变。它仍然不起作用。当我用户输入“1”时,出于某种原因,每次遍历都会输出“0”。。。我认为这是因为数据没有被引用回方法中,所以它们都没有任何数据可以处理……你的方法有点错误,这就是为什么所有这些都发生了。您希望您的代码做什么?告诉我,我会相应地修改我的答案。但要迅速回应这一评论。