2016-03-04 5 views
-1

Привет У меня возникла небольшая проблема с удалением из двоичного дерева в C#. Я не знаю, почему, но этот код не работает хорошо (мое дерево не изменяется после вызова метода удаления). Вот мой код:Удалить из двоичного дерева C#

public class BinaryTree<T> 
{ 
    public BinaryTree<T> Left, Right; 
    public T Data; 
    public BinaryTree() 
    { 
     this.Left = null; 
     this.Right = null; 
    } 
} 


public BinaryTree<T> FindNode(T value,ref BinaryTree<T> myTree) 
{ 
    if (myTree == null) 
     return null; 
    else 
    { 
     int result = Comparer<T>.Default.Compare(value, myTree.Data); 
     if (result == 0) 
      return myTree; 
     else if (result > 0) 
      return FindNode(value, ref myTree.Right); 
     else if (result < 0) 
      return FindNode(value, ref myTree.Left); 
    } 
    return myTree; 
} 

public void RemoveValue(T value,ref BinaryTree<T> myTree) 
{ 
    BinaryTree<T> helper = new BinaryTree<T>(); 
    BinaryTree<T> MyTree = myTree; 
    if (MyTree == null) return; 
    MyTree =FindNode(value,ref MyTree); 
    if (MyTree.Left == null || MyTree.Right == null) 
     helper = MyTree; 
    else 
    { 
     helper = MyTree.Left; 
     while (helper.Right!=null) 
      helper = helper.Right; 
     MyTree.Data = helper.Data; 
    } 
    if (helper.Left == null) 
     helper = helper.Right; 
    else 
     helper = helper.Left; 
} 

BinaryTree, представляющий каждый узел в моем дереве.

+2

FYI не нужно использовать ключевое слово 'ref' в' FindNode', так как вы не переназначаете vlaue на 'myTree' – juharr

+0

Вы подтвердили, что ваш метод FindNode работает правильно/по назначению? – KDecker

+0

FindNode работает отлично, он возвращает узел со значением из метода RemoveValue – dawcza94

ответ

0

Вот небольшая очистка от вас кода с предложениями о том, как я думаю, RemoveValue должен работать. Я оставляю это для вас, чтобы завершить реализацию.

public class BinaryTree<T> 
{ 
    public T Data; 
    public BinaryTree<T> Left, Right; 
    public BinaryTree() 
    { 
     this.Left = null; 
     this.Right = null; 
    } 

    public static BinaryTree<T> FindNode(T value, BinaryTree<T> myTree) 
    { 
     if (myTree == null) 
      return null; 
     else 
     { 
      int result = Comparer<T>.Default.Compare(value, myTree.Data); 
      if (result == 0) 
       return myTree; 
      else if (result > 0) 
       return FindNode(value, myTree.Right); 
      else if (result < 0) 
       return FindNode(value, myTree.Left); 
     } 
     return myTree; 
    } 

    public static void RemoveValue(T value, ref BinaryTree<T> myTree) 
    { 
     if (myTree == null) 
      return; 
     BinaryTree<T> treeNodeToRemove = FindNode(value, myTree); 

     // First case: The node to remove has a single subtree 
     if(treeNodeToRemove.Left == null^treeNodeToRemove.Right == null) 
     { 
      // We need to change the Left||Right reference of our parent to us... 
     } 
     // Second case: Both subtrees are null 
     else if (treeNodeToRemove.Left == null && treeNodeToRemove.Right == null) 
     { 
      // We need to change the reference of our parent to null 
     } 
     // Third case: Both subtrees are full 
     else 
     { 
      // ... 
     } 
    } 
} 

Также здесь is a link я использовал, который описывает три случая.

+0

Что такое различие между этим и моим кодом? Я не понимаю ... – dawcza94

+0

Ничего особенного, просто читать легче и с некоторыми логическими изменениями в структуре. Я просто дал то же самое, что и вы, с этим вопросом. Твоя «не работает», поэтому моя тоже. Это просто отвлекает нас от разговоров о том, что мы находимся в комментариях по этому вопросу к реальной проблеме самого метода. – KDecker

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