一般的なツリー (1 つ以上の子を持つツリー) をバイナリ ツリーに変換しようとしています。私の一般的なツリーは、以下を含む XML ファイル名「1.xml」で表されます。
<A>
<B/>
<C>
<E/>
<F/>
</C>
<D/>
</A>
だから私はこのような二分木を表すことができます:
このツリーを二分木に変換するには、次の方法を使用します。
A ---- # -------- # ------ #
| | |
B C--#--# D
| |
E F
(# (DIESE) の数は、特定のノードの兄弟の数を表します) 右端のノードがツリーのルートです。
A <---- # <-------- # <------ #
| | |
B C<--#<--# D
| |
E F
より明確に二分木はこの絵のようです
それを行うには、このコードを書きます:
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();
}
}
この結果を取得しています( # の代わりに DIESE(親ノードの名前) を入力しています):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<DIESE>
<DIESE>
<DIESE>
<A/>
<B/>
</DIESE>
<DIESE/>
</DIESE>
<D/>
</DIESE>
ノード C、E、F が欠落しているツリーがあるので、理由がわかりません。再帰メソッドの問題ですe NaireTreeToBinaryTree