Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用递归返回的对树中节点的引用不允许更改节点本身_Java_Pass By Reference_Treenode - Fatal编程技术网

Java 使用递归返回的对树中节点的引用不允许更改节点本身

Java 使用递归返回的对树中节点的引用不允许更改节点本身,java,pass-by-reference,treenode,Java,Pass By Reference,Treenode,我的数据结构类正在处理树。我们正在实现一个三元树,包含两个值,分别引用左、中、右节点(左子树小于值1,中子树介于值1和值2之间,右子树大于值2)。已经为树类提供了接口,find、insert和delete方法必须是递归的。将对其进行测试的客户机代码重复使用insert方法创建树,根以null开头 我试图通过在单独的私有方法中查找父节点,然后根据需要更改返回的节点,从而将值递归地插入到树中。当前的问题是,该方法返回初始节点,即根,并使用该值正确创建一个新节点,因为根为null。但是,根仍然为空 我

我的数据结构类正在处理树。我们正在实现一个三元树,包含两个值,分别引用左、中、右节点(左子树小于值1,中子树介于值1和值2之间,右子树大于值2)。已经为树类提供了接口,find、insert和delete方法必须是递归的。将对其进行测试的客户机代码重复使用insert方法创建树,根以
null
开头

我试图通过在单独的私有方法中查找父节点,然后根据需要更改返回的节点,从而将值递归地插入到树中。当前的问题是,该方法返回初始节点,即根,并使用该值正确创建一个新节点,因为根为null。但是,根仍然为空

我很确定这是由于Java中引用和值的工作方式(类似于中描述的C#);考虑到这些限制,我应该如何更改它以允许插入到树中?下面是树类中当前的insert方法,以及类似的私有方法

public void insert(AnyType newData)
{
    // If insert node is null, make a new node with newData as first key
    TernaryNode<AnyType> insert_node = findNode(newData, root);
    if (insert_node == null)
    {
        insert_node = new TernaryNode<AnyType>(newData);
    }
    else
    {
        // Get the key that is equal if the insert node is not null
        if (insert_node.getKey1() == null)
        {
            insert_node.setKey1(newData);
        }
        else
        {
            insert_node.setKey2(newData);
        }
    }// end else
}// end insert

private TernaryNode<AnyType> findNode(AnyType item, TernaryNode<AnyType> node)
{
    TernaryNode<AnyType> current_node = node;
    if (current_node != null)
    {
        if (current_node.getKey1() != item &&
                current_node.getKey2() != item)
        {
            // Comparator checks left
            if (compare.compare(current_node.getKey1(), item) <= -1)
            {
                return findNode(item, current_node.left);
            } // Comparator checks right
            else  if (compare.compare(current_node.getKey2(), item) >= 1)
            {
                return findNode(item, current_node.right);
            }// Comparator checks middle
            else
            {
                return findNode(item, current_node.middle);
            }
        }// end while
    }// end if
    // Return current node even if it is null
    return current_node;
}// end findNode
public void insert(AnyType newData)
{
//如果insert node为null,则使用newData作为第一个键创建一个新节点
ternalynode insert_node=findNode(newData,root);
if(insert_node==null)
{
插入_节点=新的TernaryNode(newData);
}
其他的
{
//如果插入节点不为null,则获取相等的键
if(insert_node.getKey1()==null)
{
插入_node.setKey1(newData);
}
其他的
{
插入_node.setKey2(newData);
}
}//结束其他
}//端部嵌件
专用TernaryNode findNode(任意类型项,TernaryNode节点)
{
TernaryNode当前节点=节点;
if(当前_节点!=null)
{
if(当前_节点.getKey1()!=项&&
当前节点。getKey2()!=项)
{
//比较器检查左侧
if(compare.compare(current_node.getKey1(),item)=1)
{
返回findNode(项目,当前_节点。右侧);
}//比较器检查中间
其他的
{
返回findNode(项目,当前_节点,中间);
}
}//结束时
}//如果结束
//返回当前节点,即使该节点为空
返回当前_节点;
}//尾翼节点

除非您将某些内容分配给
成员,否则它将永远不会获得值。您可能需要为树使用某种外部容器,类似于XML文档(也是树)的外部
文档
对象不同于实际文档根节点。

TernaryNode insert\u node=findNode(newData,root);
    TernaryNode<AnyType> insert_node = findNode(newData, root);
    if (insert_node == null)
    {
            insert_node = new TernaryNode<AnyType>(newData);
            root = insert_node;
    }
if(insert_node==null) { 插入_节点=新的TernaryNode(newData); 根=插入_节点; }
谢谢您的发帖。但是,该方法旨在从根开始,然后从根向前移动。如果根为null,这段代码将始终使其成为插入节点,这绝对不是我想要的;只要在适当的时候把它分配给根就行了。谢谢杰里科。我对此进行了更新,以澄清有关root为什么以null开头的要求;它是较大树类的字段。