2014-01-29 27 views
0

我有一个由DefaultMutableTreeNodes组成的JTree。每个节点都有一个包含一些数据的UserObject。其中一个数据是我称之为“大小”的东西。我想通过其子节点“大小”的总和来遍历树更新每个节点。使用从孩子获得的信息遍历树更新父节点

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); 
     } 
    } 

我试过上面的代码,但它只能用于节点,直到第二级。

我错过了什么?

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

我用最终的代码编辑了你的答案!再次感谢! –