2011-10-20 7 views
1
public void deleteLeaves(BSTNode<T> p){      //deletes leaves 
    if(p.left != null){ 
     if(isLeaf(p.left)) 
     p.left = null; 
    } 
    else if(p.right != null){ 
     if(isLeaf(p.right)) 
     p.right = null; 
    } 
    else{ 
     deleteLeaves(p.right); 
     deleteLeaves(p.left); 
    } 
    } 

なぜ、それがリーフを正しく削除しないのかわかりません。それは木の最終的な葉だけを削除するようです。助けになるどんなアドバイスも非常に高く評価されます。バイナリツリーからリーフを削除する

答えて

2

if文がちょっと混乱しています。 唯一のの枝が取られます。 p.leftp.rightもnullの場合、どうなるか考えてみてください。

私が正しくあなたのデータ構造を理解していれば、私はおそらく、このようにそれを記述します:p.left != nullはそれでもp.rightをチェックしない場合は、現時点で

// If there is something to the left... 
if (p.left != null) 
    if (isLeaf(p.left)) 
     p.left = null;    // delete it if it's a leaf... 
    else 
     deleteLeaves(p.left);  // else recurse. 

// If there's something to the right... 
if (p.right != null) 
    if (isLeaf(p.right)) 
     p.right = null;   // delete it if it's a leaf... 
    else 
     deleteLeaves(p.right);  // else recurse. 
+0

大変ありがとうございました。 – Bill

+0

問題ありません。どういたしまして。 – aioobe

+0

この回答は、私が同じ問題について持っていた問題を解決しました: http://stackoverflow.com/questions/28313390/removing-leaves-from-binary-tree-not-being-represented-properly/28313612#28313612 –

0

else-ifはちょうどifである必要があります。また、隣り合うノードの両方がヌルである場合は、deleteLeaves()をコールします。ヌルでは意味がありません。コードを再構築します。 @aioobeは良い提案を持っています

0

再帰を適切に使用するには、同じ種類の制御文にする必要があります。あなたはifの条件をチェックしてはいけません、else ifやelseの中で実際の再帰を行います。

+0

私は見る条件ブロック内で再帰的に問題はありません。 – aioobe

+0

もしそれが読まれたとしたら、私は、再帰が必要かどうか/それがどのように実装されているかを決定するのと同じ条件ブロックで再帰を行うべきだということを意味しました。 – SetSlapShot

関連する問題