2014-01-29 6 views
0

DefaultMutableTreeNodes에 의해 형성된 JTree가 있습니다. 각 노드에는 일부 데이터가 포함 된 UserObject가 있습니다. 이 데이터 중 하나는 내가 "크기"라고 부르는 것입니다. 나는 각 노드를 자식의 "크기"의 합계로 업데이트하는 트리를 traveste하고 싶습니다.자식 노드에서 얻은 정보로 부모 노드를 업데이트하는 트리를 탐색하십시오.

public void traverse(DefaultMutableTreeNode root) 
    { 
     Field f; 

     int offset = 0; 
     int size = 0; 

     // Just changing enumeration kind here 
     @SuppressWarnings("unchecked") 
     Enumeration<DefaultMutableTreeNode> en = root.postorderEnumeration(); 
     while (en.hasMoreElements()) 
     { 
      DefaultMutableTreeNode node = en.nextElement(); 
      f = (Field)node.getUserObject(); 
      if (node.isLeaf()) 
      { 
       size += f.getSize(); 
      } 
      else 
      { 
       f.setSize(size); 
       size = 0; 
      } 
      System.out.println((node.isLeaf() ? " - " : "+ ") + " -----> "+f); 
     } 
    } 

위 코드를 시도했지만 2 레벨까지만 노드에서 작동합니다.

무엇이 누락 되었습니까?

TIA.

+1

"자녀의 크기의 합"은 무엇을 의미합니까? 부모가 직접 자식의 크기 만 또는 각 하위 트리의 크기와 그 자식을 루트로 합한 크기를 가질 것입니까? – AnxGotta

+0

좋은 지적. 각 "부모"는 직계 자녀의 크기의 합계를가집니다. 여기에 어떤 유형의 재귀가 필요할 것으로 생각되지만 아직 기능적 코드를 만들 수는 없습니다. –

답변

0

아마 시도 :

Seudocode

public void traverse(DefaultMutableTreeNode root) 
{ 
    Field f; 

    @SuppressWarnings("rawtypes") 
    Enumeration en = root.postorderEnumeration(); 
    while (en.hasMoreElements()) 
    { 
     DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) en.nextElement(); 
     if (currentNode.getParent() != null) 
     { 
      f = ((Field) ((DefaultMutableTreeNode) currentNode.getParent()).getUserObject()); 
      f.setSize(f.getSize() + ((Field) ((DefaultMutableTreeNode) currentNode).getUserObject()).getSize()); 
     } 
    } 
} 

postOrderEnumerator 내가 그것을가하는 생각하는 방식을 작동하는 경우이 작동합니다.

+0

매력처럼 작동합니다. 일부 구문 오류를 수정하고 모든 노드에서 내 UserObject를 사용하도록 조정했습니다. 도와 주셔서 정말로 고맙습니다. –

+1

좋았어, 네가 잘 됐어! – AnxGotta

+0

최종 코드로 답변을 편집했습니다! 다시 한 번 감사드립니다! –

관련 문제