2016-04-28 10 views
0

編集:C#BSTからノードを削除 - 正しいトラックにいますか?

私はこれまでに手伝ってくれてありがとうございました。私は使用しています。ステップオーバーして作業していますが、ノードは削除されていません。

私は実際にはBSTに5つの引数を使用しますが、テスト目的では1つだけ使用します。子供が問題ないかどうか比較して見つけます。ちょうどヌルに設定されません。

0または1の子を持つテストノードのみ。

メイン

Tree aTree = new Tree(); 
aTree.InsertNode("a"); 
aTree.InsertNode("s"); 
aTree.InsertNode("3"); 
aTree.InsertNode("1"); 
aTree.InsertNode("p"); 
aTree.PreorderTraversal(); 
aTree.RemoveNode("p"); 
aTree.RemoveNode("3"); 
aTree.PreorderTraversal(); 
Console.ReadKey(); 

私の削除方法は以下のとおりです。

ツリーノード

public void Remove(TreeNode root, TreeNode Delete) { 
     if (Data == null) { 

     } 
     if (Delete.Data.CompareTo(root.Data) < 0) { 
      root.nodeLeft.Remove(root.nodeLeft, Delete); 
     } 
     if (Delete.Data.CompareTo(root.Data) > 0) { 
      root.nodeRight.Remove(root.nodeRight, Delete); 
     } 
     if (Delete.Data == root.Data) { 
      //No child nodes 
      if (root.nodeLeft == null && root.nodeRight == null) { 
       root = null;  
      } 
      else if (root.nodeLeft == null) 
      { 
       TreeNode temp = root; 
       root = root.nodeRight; 
       root.nodeRight = null; 
       temp = null; 

      } 
      //No right child 
      else if (root.nodeRight == null) 
      { 
       TreeNode temp = root; 
       root = root.nodeLeft; 
       root.nodeLeft = null; 
       temp = null; 

      } 
      //Has both child nodes 
      else 
      { 
      TreeNode min = minvalue(root.nodeRight); 
      root.Data = min.Data; 
      root.nodeRight.Remove(root.nodeRight, min); 
      } 


     } 

    } 

public TreeNode minvalue(TreeNode node) 
{ 
    TreeNode current = node; 

    /* loop down to find the leftmost leaf */ 
    while (current.nodeLeft != null) 
    { 
     current = current.nodeLeft; 
    } 
    return current; 
} 

ツリー

を探します
public void RemoveNode(string Nation) 
{ 
TreeNode Delete = new TreeNode(Nation); 
root.Remove(root, Delete); 
} 
+0

どのラインでエラーが発生しますか? – Gusman

+0

(Delete.Data.CompareTo(root.Data)<0) 場合、Delete.Data(IF {root.nodeLeft = **(削除、root.nodeLeft)を取り外し ここで** //ボイドエラー}。 (root.nodeRight、Delete); ** //ここでは無効なエラー } – ProblemJack

答えて

1

Removeは、戻り値の型voidのですが、あなたはあなたの型変換エラーを引き起こし、root.nodeLeftroot.nodeRightに割り当てしようとしています。一般的に、あなたの削除機能は、あなたのノードが両親を参照していないので、方法はありません、そうでない場合

public void Remove(TreeNode root, TreeNode Delete) { 
     if (Data == null) { 
      return null; 
     } 
     if (Delete.Data.CompareTo(root.Data) < 0) { 
      root.nodeLeft = (root.nodeLeft.Remove(root.nodeLeft, Delete)); 
      return root; 
     } 
     ... and so on. 

のように、結果としてサブツリーのルートを返すように

+0

私はroot.nodeLeft =からコードを変更しました。(ルート(ルートデータ)> 0) { root.nodeRight = .nodeLeft、Delete); 〜root.nodeLeft.Remove(root、Delete)に;私はこれをスピンし、それがどうなるか見てみましょう。 返信ありがとう – ProblemJack

+0

ありがとうヘルプとそれは基本的に動作しますが、根は何らかの理由でnullに設定されません。 – ProblemJack

+0

子ノードがない場合はどうですか?ルートをヌルに設定している場所を確認できるのはこれだけです。 – AntiTcb

0

を必要とします親が子ノードがなくなったこと、または新しいノードが現在サブツリーのルートにあることを知ることができます。

+0

それはまだ動作していない、非常に混乱している。 – ProblemJack

+0

他のすべてが失敗した場合は、デバッガを使用してください;) –

+0

- 1つ、2つ、3つのノードからなる小さなツリーから始め、そこにあなたの道を整えます。 –

関連する問題