2016-08-04 67 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); 
     } 
    } 

} 

所有這些都說了,它看起來像圍繞着這些節點的初始添加的漫長路線。在不知道底層數據結構來填充樹的情況下,人們只能猜測如何防止首先添加這些節點。