2016-04-15 13 views
0

私はBSTを持っており、BSTからノードを削除したいときは何も起こりません。誰かが理由を説明できますか?ここでBSTのノードの削除

は私のコードです:

private void delete(int value, Node node) { 
    if (value<node.value) delete(value, node.left); 
    else if (value> node.value) 
     delete(value, node.right); 
    else { 
     if (node.left != null && node.right != null) { 
      int maxFromLeft = findMax(node.left); 
      node.value = maxFromLeft; 
      delete(maxFromLeft, node.left); 
     } else if (node.left != null) { 
      Node trash = node; 
      node = node.left; 
      trash = null; 
     } else if (node.right != null) { 
      Node trash = node; 
      node = node.right; 
      trash = null; 
     } else { 
      node = null; 
     } 
    } 
} 
+0

問題の[MCVE](http://stackoverflow.com/help/mcve)を提供してください。これは、バグが他の機能に隠されることがあるため、他人があなたのバグを再現するのを助け、見つけます。例えば、単純化された 'Node'クラスと' findMax'関数です。簡単なテストケースとエラー出力、期待される出力を提供できる方が良いでしょう。 – Nier

+0

Javaが持っていない、参照渡しのセマンティクスを想定しているようです。 –

答えて

0

署名がvoid delete(int,Node)のメソッドは機能しません。ノードが1つしかないツリーからルートを削除しようとするとどうなるかを考えてください。このメソッドは、メソッドのパラメータが値渡しされるためノードを削除できません。あなたは何ができるか

が、この方法から変更BSTを返すです:

Node delete(int value, Node node) { 
    if (value<node.value) node.left = delete(value, node.left); 
    else if (value> node.value) 
     node.right = delete(value, node.right); 
    ...I'll leave the rest as an exercise... 
    return node; 
} 
1

は、このあなたがnodeを削除する必要が一部

if (node.left != null) { 
Node trash = node; 
node = node.left; 
trash = null; 
} 

考えてみましょう。これは何もしませんnode = node.left。 1つの参照を別の参照に割り当てます。これはあまりにも必要としませんtrash = null

ノードを削除するには、最初に親ノードから切断し、削除されたノードの1つの子ノードを親ノードに接続し、他の子ノードを挿入する必要があります。

関連する問題