2015-10-07 47 views
0

我编写了以下代码来实现JAVA中的二叉搜索树。除了搜索方法外,一切看起来都很好。每个节点都有一个键(Item),一个字符串类型的对象以及对左右节点的引用。在二叉搜索树中自动删除元素

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); 
    } 

} 

下面的代码输出:

List: 
1 aaaa 
4 aaa 
6 a 
7 aa 
8 bb 
9 b 
Object for 9 is b 
Object for 1 is aaaa 
List: 
1 aaaa 
6 a 
8 bb 
9 b 
Object for 8 is bb 
Object for 4 NOT FOUND\ 

其清楚地表明用键47的元素是不存在了。任何人都可以解释吗?

+0

正确。 @ user3824413,你的搜索方法会改变结构本身 - 这是问题的原因。 dream_machine已经指出了。 –

+0

@ArthurGevorkyan即使我使用'Temp'本身而不是'Temp.right'或'Temp.left',它似乎工作得很好。虽然使用'Temp'不会破坏链接吗? – user3824413

+0

只需逐步调试搜索方法,您将看到如何在执行过程中替换节点。它与Temp“效果很好”的事实相比,是一个副作用比期望的行为(我希望至少)。 –

回答

5

它应该是:

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; 
     } 

你在这个方法将断节点链接更新节点。

Temp.right = searchRec(Temp.right, key); // wrong 
Temp.left = searchRec(Temp.left, key); // wrong 

更新:

您可以更换:

t = searchRec(Temp.right, key); 
return t; 

与此也

return searchRec(Temp.right,key); 

左同样的方式,这将不需要任何临时变量。

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; 
    } 
+0

即使我使用'Temp'本身而不是't',它似乎工作得很好。虽然使用'Temp'不会破坏链接吗? – user3824413

+0

@ user3824413是的,它不会更新链接。你也可以使用它。 –