2012-06-08 71 views
0

我試圖將一般樹(具有一個或多個孩子的樹)轉換爲二叉樹。我的一般樹由XML文件名「1 .XML」包含:生成二叉樹形式N aire樹 - 遞歸方法不起作用

<A> 
    <B/> 
    <C> 
     <E/> 
     <F/> 
    </C> 
    <D/> 
</A> 

,所以我可以代表二進制樹是這樣的:

enter image description here

我們這棵樹轉換爲二叉樹我用下面的方法:

A ---- # -------- # ------ # 
     |   |  | 
     B C--#--#  D 
       | | 
       E F 

(#(DIESE)的數量是指給定節點的兄弟的數量) 最右邊的節點是樹的根。

A <---- # <-------- # <------ # 
      |   |   | 
      B C<--#<--#   D 
        | | 
        E F 

更清楚二叉樹是喜歡這幅畫

enter image description here

這樣做,我寫這個代碼:

public static Node NaireTreeToBinaryTree (Node node,Document d) 
{ 

    if (isLeaf(node)) 
    { 
     return node;    
    } 
    else 
    { 
     List<Element> liste = GetChildren(node); 
     Node tmp= d.createElement(node.getNodeName());   
     for (int i=0;i<liste.size();i++) 
     { 
      Element root = d.createElement("DIESE"); 
      root.appendChild(tmp); 

      Element child2 = d.createElement(NaireTreeToBinaryTree(liste.get(i),d).getNodeName()); 
      root.appendChild(child2); 
      tmp=root; 

     } 
     return tmp; 
    } 

} 




public static void WritingIntoXML (Node node ,Document d) 
{ 
    try{ 

     d.appendChild(node); 

     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     DOMSource source = new DOMSource(d); 


     // Output to console for testing 
     StreamResult result2 = new StreamResult(System.out); 

     transformer.transform(source, result); 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 

} 

public static void main(String[] args) { 

    Node root = GetNodeParent("1.xml"); // Get the node parent 


    try{ 
    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
    Document doc = docBuilder.newDocument(); 

    Node a =NaireTreeToBinaryTree (root, doc); 

    WritingIntoXML (a ,doc); 


    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 



} 

即時得到這個結果(IM puting DIESE(中父節點的名稱)而不是#):

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<DIESE> 
    <DIESE> 
      <DIESE> 
       <A/> 
       <B/> 
      </DIESE> 
     <DIESE/> 
    </DIESE> 
    <D/> 
</DIESE> 

有樹缺少節點C,E,F所以我不知道爲什麼? 是遞歸梅索德問題NaireTreeToBinaryTree

+0

你可能想用dom替換jdom標記...這不是JDOM相關的問題(不是xml解析的問題...)。 – rolfl

回答

2

正如你所看到的,它通過一個節點替換一個新的子樹複製錯誤。

public static Node naireTreeToBinaryTree (Node node,Document d) 
{ 
    if (isLeaf(node)) 
    { 
     //-return node;    
     return d.createElement(node.getNodeName()); 
    } 
    else 
    { 
     List<Element> liste = getChildren(node); 
     Node tmp= d.createElement(node.getNodeName());   
     for (int i=0;i<liste.size();i++) 
     { 
      Element root = d.createElement("DIESE"); 
      root.appendChild(tmp); 

      //-Element child2 = d.createElement(naireTreeToBinaryTree(liste.get(i),d).getNodeName()); 
      Node child2 = naireTreeToBinaryTree(liste.get(i),d); 
      root.appendChild(child2); 
      tmp=root; 

     } 
     return tmp; 
    } 
} 
+0

+1非常感謝你 –

+1

@WassimSboui很高興看到一個基本正確的緊湊解決方案。我也喜歡優雅的描繪。只有C-sharpish拼寫傷害;)。 –