Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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_Binary Tree - Fatal编程技术网

Java二进制搜索树删除

Java二进制搜索树删除,java,binary-tree,Java,Binary Tree,我正在为二叉搜索树编写一个delete方法,它不完整,但我填充了一个树,这样我至少可以测试我要删除的节点是一个叶子,但它似乎不工作的情况。我的逻辑有明显的错误吗 public void delete(E d) { delete( d, root); } private void delete( E d, Node<E> T) { if(T == null) { return; } else if(d.equals(T.getD

我正在为二叉搜索树编写一个delete方法,它不完整,但我填充了一个树,这样我至少可以测试我要删除的节点是一个叶子,但它似乎不工作的情况。我的逻辑有明显的错误吗

public void delete(E d)
{
    delete( d, root);
}

private void delete( E d, Node<E> T)
{
    if(T == null)
    {
        return;
    }
    else if(d.equals(T.getData()))
    {
        System.out.println("it found the node at least");
        if(T.getRight() == null && T.getLeft() == null)
        {
            T.setData(null);
        }
        //do alot)
    }
    else if(d.compareTo(T.getData()) > 0)
    {
        System.out.println("going right");
        delete(d, T.getRight());
    }
    //s is less than T, insert on left subtree
    else
    {System.out.println("going left");
        delete(d,T.getLeft());
    }

}  
公共作废删除(E-d)
{
删除(d,根);
}
私有无效删除(E-d,节点T)
{
如果(T==null)
{
返回;
}
else if(d.equals(T.getData()))
{
System.out.println(“它至少找到了节点”);
if(T.getRight()==null和&T.getLeft()==null)
{
T.setData(空);
}
//做很多事情)
}
else if(d.compareTo(T.getData())>0)
{
System.out.println(“向右转”);
删除(d,T.getRight());
}
//s小于T,在左子树上插入
其他的
{System.out.println(“向左走”);
删除(d,T.getLeft());
}
}  

您的代码不会删除节点。它只是清除它们。
为了实现删除,您必须将函数更改为无效,但:

private Node delete(ed,Node T)

您的代码应该是这样的:

public void delete(E d) {
    root = delete( d, root);
}

private void delete( E d, Node<E> T)
{
    if(T == null)
    {
        return;
    }
    else if(d.equals(T.getData()))
    {
        System.out.println("it found the node at least");
        if(T.getRight() == null && T.getLeft() == null)
        {
           return null;
        }
        //do alot)
    }
    else if(d.compareTo(T.getData()) > 0)
    {
        System.out.println("going right");
        T.right = delete(d, T.getRight());
    }
    //s is less than T, insert on left subtree
    else
    {
        System.out.println("going left");
        T.left = delete(d,T.getLeft());
    }

}  
公共作废删除(E-d){
根=删除(d,根);
}
私有无效删除(E-d,节点T)
{
如果(T==null)
{
返回;
}
else if(d.equals(T.getData()))
{
System.out.println(“它至少找到了节点”);
if(T.getRight()==null和&T.getLeft()==null)
{
返回null;
}
//做很多事情)
}
else if(d.compareTo(T.getData())>0)
{
System.out.println(“向右转”);
T.right=delete(d,T.getRight());
}
//s小于T,在左子树上插入
其他的
{
System.out.println(“向左走”);
T.left=delete(d,T.getLeft());
}
}  

你明白了…

什么是
//do alot)
?另外,将
数据设置为
null
并不是我所说的删除。do alot意味着对其余情况进行编码。我该如何删除它?有什么问题吗?无法搜索节点吗?