Java 在二进制搜索树中自动删除的元素

Java 在二进制搜索树中自动删除的元素,java,data-structures,binary-search-tree,Java,Data Structures,Binary Search Tree,我为在JAVA中实现二进制搜索树编写了以下代码。除了搜索方法外,一切似乎都很正常。每个节点都有一个键(项)、一个string类型的对象以及对左、右节点的引用 class BinarySearchTree1 { class Node // Node for BST { private int item; private String obj; private Node left; private Node right; No

我为在JAVA中实现二进制搜索树编写了以下代码。除了搜索方法外,一切似乎都很正常。每个节点都有一个键(项)、一个string类型的对象以及对左、右节点的引用

    class BinarySearchTree1
    {
    class Node // Node for BST
    {
    private int item;
    private String obj;
    private Node left;
    private Node right;
     Node(int Item,String Obj)
    {
        item = Item;
        obj = Obj;
        left = null;
        right = null;
    }
    }

    Node root; //Root of the BST

    BinarySearchTree1() // Constructor
    {
    root = null;
    }

    void insert(int key,String obj) // Insertion
    {
     root = insertItem(root,key,obj);
    }
    Node insertItem(Node root,int key,String obj)
    {
    if(root == null)
    {
        root = new Node(key,obj);
        return root;
    }
    else if(key>root.item)
    root.right = insertItem(root.right,key,obj);
    else
    root.left = insertItem(root.left,key,obj);
    return root;

    }

     void inOrder() // View Records in order
     {
        System.out.println("List: ");
        inOrderRec(root);
     }

   void inOrderRec(Node root)
  {
    if(root != null)
    {
        inOrderRec(root.left);
        System.out.println(root.item + " "+ root.obj);
        inOrderRec(root.right);
    }
  }

  void search(int key) // Search
  {
    Node Temp;
    Temp = root;
    Temp = searchRec(Temp,key);
    if(Temp == null)  // Element Not Found
    {
        System.out.println("Object for "+key+" NOT FOUND");
        return;
    }
      System.out.println("Object for "+ Temp.item+" is "+ Temp.obj); //      Element Found
  }

Node searchRec(Node Temp,int key)
{

    if(Temp != null)
    { 
    if(key>Temp.item)
    {
        Temp.right = searchRec(Temp.right,key);
        return Temp.right;
    }
    if(key<Temp.item)
    {
        Temp.left = searchRec(Temp.left,key);
        return Temp.left;
    }
    if(key==Temp.item)
    return Temp;
    }
    return Temp;
}



 public static void main(String[] args)
    {
        BinarySearchTree1 b1 = new BinarySearchTree1();
        b1.insert(6,"a");
        b1.insert(7,"aa");
        b1.insert(4,"aaa");
        b1.insert(1,"aaaa");
        b1.insert(9,"b");
        b1.insert(8,"bb");

        b1.inOrder();
        b1.search(9);
        b1.search(1);
        b1.inOrder();
        b1.search(8);
        b1.search(4);
        //System.out.println(b1.root.obj);
    }

}
显然,带有键
4
7
的元素不再存在。有人能解释一下吗?

应该是:

Node searchRec(Node Temp, int key) {

            if (Temp != null) {
                Node t = null;
                if (key > Temp.item) {
                    t = searchRec(Temp.right, key);
                    return t;
                }
                if (key < Temp.item) {
                    t = searchRec(Temp.left, key);
                    return t;
                }
                if (key == Temp.item)
                    return Temp;
            }
            return Temp;
        }
更新:

您可以替换:

t = searchRec(Temp.right, key);
return t;
还有这个

return  searchRec(Temp.right,key);  
与left相同,这不需要任何临时变量

Node searchRec(Node Temp,int key)
    {
        if(Temp != null)
        { 
            if(key>Temp.item)
            {
                return  searchRec(Temp.right,key);  
            }
            if(key<Temp.item)
            {
                return searchRec(Temp.left,key);
            }
            if(key==Temp.item)
                return Temp;
        }
        return Temp;
    }
Node searchRec(节点温度,int键)
{
如果(温度!=null)
{ 
如果(键>临时项目)
{
返回searchRec(右临时键);
}
如果(键它应该是:

Node searchRec(Node Temp, int key) {

            if (Temp != null) {
                Node t = null;
                if (key > Temp.item) {
                    t = searchRec(Temp.right, key);
                    return t;
                }
                if (key < Temp.item) {
                    t = searchRec(Temp.left, key);
                    return t;
                }
                if (key == Temp.item)
                    return Temp;
            }
            return Temp;
        }
更新:

您可以替换:

t = searchRec(Temp.right, key);
return t;
还有这个

return  searchRec(Temp.right,key);  
与left相同,这不需要任何临时变量

Node searchRec(Node Temp,int key)
    {
        if(Temp != null)
        { 
            if(key>Temp.item)
            {
                return  searchRec(Temp.right,key);  
            }
            if(key<Temp.item)
            {
                return searchRec(Temp.left,key);
            }
            if(key==Temp.item)
                return Temp;
        }
        return Temp;
    }
Node searchRec(节点温度,int键)
{
如果(温度!=null)
{ 
如果(键>临时项目)
{
返回searchRec(右临时键);
}

如果(key correct.@user3824413,你的搜索方法改变了结构本身-这就是问题的原因。dream\u机器已经指出了这一点。@ArthurGevorkyan即使我使用
Temp
本身而不是
Temp.right
Temp.left
,它似乎也能完全正常工作。而使用
Temp
不是吗断开链接?只需一步一步地调试搜索方法,您就会看到在执行过程中节点是如何被替换的。事实上,它与Temp“运行良好”是一种副作用,而不是一种期望的行为(我希望至少是这样).Correct.@user3824413,你的搜索方法改变了结构本身-这就是问题的原因。dream\u机器已经指出了这一点。@ArthurGevorkyan即使我使用
Temp
本身而不是
Temp.right
Temp.left
,它似乎也能完全正常工作。使用
Temp
时,不是吗break链接?只需一步一步地调试搜索方法,您就会看到在执行过程中节点是如何被替换的。事实上,它与Temp“运行良好”是一个副作用,而不是期望的行为(我希望至少如此)。即使我使用
Temp
本身而不是
t
,它似乎也能完全正常工作。当使用
Temp
时,它不会断开链接吗?@user3824413是的,它不会更新链接。你也可以使用它。即使我使用
Temp
本身而不是
t
,它也能完全正常工作。在使用
Temp时de>它不会破坏链接吗?@user3824413是的,它不会更新链接。你也可以使用它。