2015-05-09 7 views
0

Мне было интересно, может ли кто-нибудь помочь мне.Удаление узла в дереве C#

Я хочу удалить узел в дереве C#, а приведенный ниже код отлично. но я не полностью понимаю, что все узлы, объявленные в процессе обхода и удаления, являются только копиями фактических узлов, и я не вижу, как они могут влиять на фактические узлы и заменять их друг другом. У меня не было проблем с использованием такого метода в C++, потому что я использовал указатели, а два указателя могли одновременно указывать на один кусок памяти, но мы не делаем этого в C#.

class BinarySearchTree<T> 
{ 
    class Node 
    { 
     public Node Left; 
     public T Info; 
     public Node Right; 
    } 
    public bool DeleteItem(T item) 
    { 
     Node t = Root, s = null; 
     while (t != null && Compare(item, t.Info) != 0) 
     { 
      s = t; 
      t = (Compare(item, t.Info) <= 0) ? t.Left : t.Right; 
     } 

     if (t == null) 
      return false; 

     if (t.Left != null && t.Right != null) //node has 2 children 
     { 
      Node suc = t.Right, parent_suc = null; 
      while (suc.Left != null) 
      { 
       parent_suc = suc; 
       suc = suc.Left; 
      } 
      if (parent_suc == null) 
       t.Right = suc.Right; 
      else 
       parent_suc.Left = suc.Right; 
      t.Info = suc.Info; 
     } 
     else //node has either one child or no child at all 
     { 
      Node child = t.Left; 
      if (t.Right != null) 
       child = t.Right; 
      if (s == null) 
       Root = child; 
      else 
      { 
       if (s.Left == t) 
        s.Left = child; 
       else 
        s.Right = child; 
      } 
     } 
     return true; 
    } 
} 
+1

В вашем коде нет копий, потому что Node является классом, а не структурой. –

+0

@ General-Doomer, что вы имеете в виду, например, «Node suc = t.Right» не присваивает значение новой части памяти? правильно? –

+0

Да, эта строка копирует только ссылки (точки), а не содержимое –

ответ

3

Ваш Node тип является класс, который является ссылочного типа. Это означает, что когда вы назначаете или копируете его в новую переменную, она создаст новую ссылку на исходные данные вместо копирования данных (напротив будет значение типа). Это действительно очень похоже на указатели C++ с некоторыми отличиями (без арифметики указателей, но с автоматической сборкой мусора).

См. this Статья MSDN о типах C# и this одна о указателях C++ и ссылках на C#.

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