2016-08-04 2 views
0

enter image description here제거 잎

의 내가 있다고 가정합시다 JTree 잎 노드의 수는 내가 코드를 실행할 때마다 달라질 수있는 내가 제공 한 사진과 유사. 이제는 내가 비어있는 노드를 제거 할 수 있습니까? (AKA는 자식이 없습니다.

열거를 사용하여 트리를 탐색하고 모든 노드가 얼마나 많은 자식 노드가 있는지 확인하기 위해 시도했지만 시도가 도움이되지 않았습니다. 왜냐하면 내가 필요한 노드가 필요한 노드라고해도 말할 수 있기 때문입니다. 제거 할 부모를 제거해야한다고 부모 노드에서 자신을 삭제하라고 말해야합니다.

내가 찾고있는 것을 얻기 위해 무엇을 사용해야합니까?

+1

지금까지 시도한 코드를 게시하십시오. – SomeDude

+1

1) 더 나은 도움을 받으려면 [MCVE] 또는 [Short, Self Contained, Correct Example] (http://www.sscce.org/)를 게시하십시오. 2) '무딘', '압력', '불타는'.. 아이들이없는 노드를 제거하는 데 관심이없는 이유는 무엇입니까? –

+0

다른 잎을 포함하지 않는 잎이기 때문에 그 노드를 제거하고 싶지 않다는 이유가 있습니다. 기본적으로 나는 아이들이있는 노드에서 자식이없는 노드를 제거하여 노드가 다른 노드 만 가질 수도 있고 잎만 가질 수도 있지만 동시에 둘 다 필요하지는 않습니다. 그리고 미안하지만 나는 내가 가지고있는 PC에 접근 할 수없고 집에 가져갈 수 없기 때문에 내가 가지고있는 코드를 게시 할 수 없다. –

답변

2

지금 어떻게 ... 비어있는 노드를 제거 할 수 그래서 내가 중 하나에 노드가 동시에

트리 트래버스

및에서만 다른 노드 또는 유일한 잎하지만 모두가 원하는 다음과 같은 기준

  1. 이 노드를 확인하는 것은
  2. 가 잎 아닌 형제 자매가있는 잎을입니다. 나는에서 오전 노드가 나는 자신의 부모 노드에서 자신을 제거하라고 어차피 그를 제거하기 위해 자신의 부모를 말할 필요가 제거 될 필요가있는 노드이라고 말할 수있는 경우에도

.

이것이 바로 DefaultTreeModel.removeNodeFromParent() 방법입니다. 따라서 트리를 재귀 적으로 탐색하고 주어진 기준에 따라 노드를 제거하면됩니다.

DefaultMutableTreeNode root = new DefaultMutableTreeNode ("Root"); 
//other code 
DefaultTreeModel treeModel = new DefaultTreeModel(root); 
JTree tree = new JTree(treeModel); 
//populate tree 

recurseTree(root, treeModel); 

//method to recursively remove leaf nodes that have non-leaf siblings 
private void recurseTree(MutableTreeNode node, DefaultTreeModel treeModel){ 
    if (node.isLeaf()){ 
     TreeNode parent = node.getParent(); 
     for (int i = 0; i < parent.getChildCount(); i++){ 
      if (!parent.getChildAt(i).isLeaf()){ 
       treeModel.removeNodeFromParent(node); 
       break; 
      } 
     } 
    }else{ 
     for (int i = 0; i < node.getChildCount(); i++){ 
      recurseTree((MutableTreeNode)node.getChildAt(i), treeModel); 
     } 
    } 

} 

이 모든 것들이 이러한 노드의 초기 추가를 둘러싼 긴 경로처럼 보입니다. 트리를 채울 기본 데이터 구조를 알지 못하면 먼저 노드가 추가되는 것을 방지하는 방법을 추측 할 수 있습니다.