2011-10-20 12 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.left이나 p.right이 null 인 경우 어떻게해야하는지 생각해보십시오.

내가 제대로 데이터 구조를 이해한다면, 아마 이런 식으로 쓰기 것 : 순간

// 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

, p.left != null 다음 심지어 p.right를 확인하지 않을 경우. else-ifif이어야합니다. 또한 두 인접 노드가 모두 null 인 경우에는 deleteLeaves()을 호출하면 NULL이 아님을 알 수 있습니다. 코드를 재구성하십시오. @aioobe는 좋은 제안이 있습니다

0

재귀를 올바르게 사용하려면 동일한 종류의 제어문을 사용해야합니다. if의 조건을 검사해서는 안되며 else if 나 else의 실제 재귀를 수행하면 안됩니다.

+0

조건부 블록 내부에서 재귀하는 데 문제가 없습니다. – aioobe

+0

Appologies는 이와 같이 읽은 경우, 재귀가 필요한지/구현 방법을 결정하는 동일한 조건부 블록에서 재귀를 수행해야한다는 것을 의미했습니다. – SetSlapShot

관련 문제