2015-02-12 2 views
0

Я делаю BST (двоичное дерево поиска). Мне нужна помощь в методе удаления, кажется, что когда я устанавливаю этот узел на нуль, он появляется, когда я показываю его с помощью моих методов отображения (предзаказ, порядок, порядок).Почему мой узел все еще появляется, когда я устанавливаю его на нуль?

Вот мой узел связанного списка класс

public class Node<T> 
{ 
    public int value; 
    public Node leftValue; 
    public Node rightValue; 
    public Node(int _value) 
    { 
     value=_value; 
    } 
} 

Вот мой метод удаления в моем классе BST

public void findDelete(Node root, int value) 
    { 
     if (root== null) 
     { 
      System.out.println(" Not founded "); 
     } 
     else if (value < root.value) 
     { 
      findDelete(root.leftValue,value); 
     } 
     else if (value > root.value) 
     { 
      findDelete(root.rightValue,value); 
     } 
     else if (value == root.value) 
     { 
      //// checks if have children 
      if (root.leftValue==null&&root.rightValue==null) 
      { 
        root = null; 
      } 
      //// one 
      else if (root.leftValue==null) 
      { 
        root.value=root.rightValue.value; 
      } 
      else if (root.rightValue==null) 
      { 
       root.value=root.leftValue.value; 
      } 
      //// two 
      else if (root.leftValue!=null && root.rightValue!=null) 
      { 
       root.value=findMin(root.rightValue); 
       findDelete(root.rightValue,value); 
      } 
     } 
     else 
     { 
      System.out.println(" Not founded "); 
     } 
    } 

Моих Удалять методы также пытается справиться с назначением нового преемника, если узел имеет ребенок (листья). Могу ли я также получить некоторую обратную связь, если я буду делать это правильно? Он пытается обрабатывать 3 случая. Случай 1 без детей, случай 2 1 ребенок, случай 3 2 ребенка.

Я думаю, вероятно, это строка в моем методе удаления, которая удаляет ее, установив ее в null, если она не имеет детей.

if (root.leftValue==null&&root.rightValue==null) 
      { 
       root = null; 
      } 

Она устанавливает его в нуль, но root.value все еще имеет значение INT, что делает его еще там, когда я показываю его с моим методом отображения. По крайней мере, это то, что я считаю проблемой. Мне нужна помощь и отзывы!

один из моего метода отображения

public void printPre(Node root) 
{ 
    if (root==null) 
    { 
     return; 
    } 
    System.out.print(root.value + ", "); 
    printPre(root.leftValue); 
    printPre(root.rightValue); 
} 

Спасибо за помощь!

+0

Знаете ли вы разницу между объектами и ссылками, а также между объектами и переменными? – immibis

+0

Думаю, что да, но если вы не возражаете прояснить, было бы полезно – Dragael

+0

Знаете ли вы разницу между переменной 'root' и объектом, на который она ссылается? – immibis

ответ

0

Когда вы вызываете метод и используете переменные в качестве аргументов, переменные не передаются в метод - только их значения. Вот почему это:

class Test1 { 
    static void addOne(int i) { 
     i++; 
    } 
    public static void main(String[] args) { 
     int x = 5; 
     addOne(x); 
     System.out.println(x); 
    } 
} 

печатает 5, а не 6. Для вызова addOne, пространство для параметра i выделяется, значение 5 копируется из x в i, прогоны метод тела (установка i до 6) , а затем локальные переменные метода уничтожаются, когда они возвращаются. x не изменяется по вызову.

Кроме того, это:

не изменяет n.leftValue. Как и прежде, выделяется локальная переменная root, значение (которое является ссылкой на объект Node) копируется из n.leftValue в root, тело метода выполняется (значение root равно null), а затем локальные переменные метода уничтожаются при его возврате , n.leftValue не модифицировано, только root.

Один из вариантов - просто вернуть новый узел, поскольку ваша функция в настоящее время ничего не возвращает. В приведенном выше упрощенном примере:

class Test3 { 
    // returns the new node 
    static Node delete(Node root) { 
     // in this example it always deletes the node by replacing it with null; 
     // obviously your actual code is more complicated than this 
     return null; 
    } 
    public static void main(String[] args) { 
     Node n = (something); // not actually (something), but something that returns a Node 
     n.leftValue = delete(n.leftValue); // <-- note the change 
    } 
} 
+0

Мои узлы объявлены в методе. Как бы я нашел, что узел получил нуль? В вашем примере для Test3 ваш узел был объявлен в void static main, поскольку мои объявлены в методе, а затем переданы в метод, который нужно вставить в BST. – Dragael

+0

@Dragael вместо 'findDelete (root.leftValue, value);' вы сделали бы 'root.leftValue = findDelete (root.leftValue, value);' – immibis

Смежные вопросы