2017-12-14 10 views
0
 a    
     /|\    
    b f c   
// 
    d x 
/\ 
e h 

이 응용 프로그램에는 이러한 종류의 트리 구조가 있습니다. 이 트리 깊이를 먼저 가로 지르고 노드 깊이를 먼저 삭제하려고합니다. 노드에는 여러 개의 하위 항목이있을 수 있습니다.깊이 우선 탐색을 사용하여 노드를 삭제하는 방법

나는하려고했지만 e, h, d, b, x, f, c, a와 같이 깊이가없는 첫 번째 순서는 삭제하지 않습니다. 자식 노드와 부모 노드를 삭제해야합니다.

function deleteNode(node) { 
    let childs = node.getChildrens(); 
    if(childs === undefined || childs === null) { 
     remove(node); 
    } else 
     for(int i = 0; i < childs.length; i++) { 
      // if childs then 
      deleteNode(childs[i]) 
     } 
    } 
    remove(node); 
} 
+1

이 삭제 변경 제안합니다은 예약 된 단어입니다. 함수 이름을 –

+1

[tag : java] 또는 [tag : javascript]로 변경 하시겠습니까? 두 가지 중 하나를 선택하십시오. 또한 개별 노드를 삭제해야하는 이유는 무엇입니까? 왜 근음을 지우는 것이 좋을까요? – Cerbrus

+0

어디서나 코드 스 니펫 일뿐입니다. 나는 이것을 여러 언어로 구현할 것이다. –

답변

2

내가 당신의 설치를 잘못 무슨 일이 일어나고 있는지 알 방법이 없습니다, 그러나 아마 당신은 당신의 else 핸들러에 외부 remove(node) 이동을 시도 할 수 :

function deleteNode(node) { 
    let childs = node.getChildrens(); 
    if(childs === undefined || childs === null) { 
     remove(node); 
    } else 
     for(int i = 0; i < childs.length; i++) { 
      // if childs then 
      deleteNode(childs[i]) 
     } 
     remove(node); 
    } 
} 

또는 더 나은 아직을 단순화 논리 추가 :

현재로서는 remove(node) 호출이 실행 중입니다. d가 오류의 원인 일 수있는 자식 노드에서 두 번.

0

나는 자식 노드를 삭제하면 자식 노드 배열의 길이가 줄어들 것이라고 믿는다. 난 당신 루프,

for(int i = 0; i < childs.length; i++) { 
      // if childs then 
      deleteNode(childs[i]) 
     } 

현재에서에

while(node.getChildrens().length>0) { 
      // if childs then 
      deleteNode(childs[0]) 
     }