2016-08-04 47 views
0

enter image description here去叶是在JTree节点之间

让我们假设我有一个JTree类似我提供的图片,其中叶节点的数量将我每次运行该代码时会有所不同。现在我怎样才能删除空的节点(AKA没有孩子),因为我无法检查,看看它是否会变空,因为我将它们添加到树中?

我已经尝试过使用枚举遍历树并检查每个节点以检查它有多少个子节点,但这并没有帮助,因为即使我可以告诉我所在的节点是需要被删除我必须告诉他的父母将他删除,我不能告诉他从他父母的节点中删除自己。

我需要用什么来实现我在找的东西?

+1

请发表您迄今尝试过的代码。 – SomeDude

+1

1)为了更快地获得更好的帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 2)为什么没有兴趣去除没有孩子的'Dull','Pressure','Burning'等节点? –

+0

我不想删除这些节点的原因是因为它们是不包含其他树叶的树叶。基本上我想从没有孩子的节点中删除没有孩子的节点,所以我想要一个节点只有其他节点或只有叶子,但不能同时在两个节点上。抱歉,但我不能发布代码我有沙发,因为我没有访问它的电脑,我不允许把我的工作带回家。 –

回答

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

} 

所有这些都说了,它看起来像围绕着这些节点的初始添加的漫长路线。在不知道底层数据结构来填充树的情况下,人们只能猜测如何防止首先添加这些节点。