2013-03-06 32 views
0

我有一些數字說110,111,114,115,120,121,112,122,130,131 現在我需要列出它們在XML樹代表一系列的數字作爲XML樹

- 110 
- 111 
    -114 
    -115 
     -120 
     -121 
     -122 
- -112 
    -130 
    -131 

也就是說,如果一個數x [I + 1]爲x [i] +1,那麼兩者都作爲同一棵樹的孩子添加。否則 x [i + 1]被添加到子樹x [i]

我知道它必須遞歸地完成,但我是如此愚蠢,以至於我無法正確理解它?迫切需要幫助。

+0

而是根據你的模式順序,不該130和131節點是112的孩子? – 2013-03-06 07:19:50

回答

0

它實際上可以作爲你描述,但是該描述是比遞歸更線性:

如果數x [I + 1] X [I] 1然後都被添加作爲同一兒童樹。 else x [i + 1]被添加到子樹x [i]

所以這只是一個循環,將前一個節點初始化爲xml文檔的根元素。對於提供

110,111,114,115,120,121,112,122,130,131 

的數字序列它,然後生成以下XML(PHP Example):

<?xml version="1.0"?> 
<root> 
    <node value="110"/> 
    <node value="111"> 
    <node value="114"/> 
    <node value="115"> 
     <node value="120"/> 
     <node value="121"> 
     <node value="112"> 
      <node value="122"> 
      <node value="130"/> 
      <node value="131"/> 
      </node> 
     </node> 
     </node> 
    </node> 
    </node> 
</root> 

所以在編寫代碼之前,我想你首先需要更恰當你真的想將其中邏輯指定跟隨。除非不明確,否則無法決定是否要用遞歸解決它,xpath表達式以及不是。

0

也就是說,如果數字x [i + 1]是x [i] +1,那麼兩者都作爲同一棵樹的孩子添加。否則x [i + 1]被添加到子樹x [i]

根據這個描述,你不能達到樹的高層。所以,你的樹看起來應該像下面這樣:

- 110 
- 111 
    -114 
    -115 
     -120 
     -121 
     -122 
     -112 
      -130 
      -131 

只要保持跟蹤的最後家長,如果x [I + 1] <> X [I] +1,重新分配的父母的最後一個節點。然後向已保存的父節點添加新節點

+0

錯誤,他需要112是111的直接兄弟,因爲它滿足這兩個x [i + 1] = x [i] +1。 – 2013-03-06 07:50:43

+0

不,因爲112在數組111之後並不正確,所以我猜這個數組叫做x。 – DixonD 2013-03-06 07:52:44

+0

這就是爲什麼他需要遞歸解決方案。不管笏排列中的發生順序如何;所以這意味着currentNode應該總是大於前一個節點,如果不是,則向後迭代並找出最後一個更大的節點。 – 2013-03-06 07:54:29

0

您需要一些堆棧;

stack<int> nodeHierarchy; 

然後算法很簡單:檢查元素是否高於以前。如果是這樣的話,那將是它的兄弟姐妹或孩子。

否則,您需要通過堆棧重新進行操作。

如果元素是兄弟,你需要通過堆棧再次回來。

讓我們假設根是0和所有其他元素均大於0

nodeHierarchy.push(0); //root 
foreach(int element){ 
    while(nodeHierarchy.top() + 1 >= element)nodeHierarchy.pop(); 
    //put element as next nodeHierarchy.top() child 
    nodeHierarchy.push(element); 
} 

我相信,這是你在想什麼,但你描述是錯誤的。如果我錯了,其他兩個答案應該是正確的。

0

修訂版(有序)結果XML:

<root> 
    <node value="110" /> 
    <node value="111"> 
     <node value="114" /> 
     <node value="115"> 
      <node value="120" /> 
      <node value="121" /> 
     </node> 
    </node> 
    <node value="112"> 
     <node value="122"> 
      <node value="130" /> 
      <node value="131" /> 
     </node> 
    </node> 
    </root> 

我曾經考慮在此代碼

XmlDocument doc = new XmlDocument(); 
int[] numArray = new int[] { 110, 111, 114, 115, 120, 121, 112, 122, 130, 131 }; 
XmlElement head = doc.CreateElement("root");  
doc.AppendChild(head); 

XmlElement cur = doc.CreateElement("node"); 
cur.SetAttribute("value", numArray[0].ToString()); 
head.AppendChild(cur); 
int pos = 0; 
BuildXml(numArray, ref pos, ref doc, head, cur); 

和遞歸函數

public static void BuildXml(int[] numArray, ref int pos, ref XmlDocument doc, XmlElement parNode, XmlElement curNode) 
{ 
    if (pos < numArray.Length-1) 
    { 
     if (numArray[pos] + 1 == numArray[pos + 1]) 
     { 
      XmlElement current = doc.CreateElement("node"); 
      current.SetAttribute("value", numArray[pos + 1].ToString()); 
      parNode.AppendChild(current); 
      pos++; 
      BuildXml(numArray, ref pos, ref doc, parNode, current); 
     } 
     else if (numArray[pos] < numArray[pos + 1]) 
     { 
      XmlElement current = doc.CreateElement("node"); 
      current.SetAttribute("value", numArray[pos + 1].ToString()); 
      curNode.AppendChild(current); 
      pos++; 
      BuildXml(numArray, ref pos, ref doc, curNode, current); 
     } 
     else 
     { 
      XmlElement elem = null; 
      foreach (XmlElement nodes in doc.FirstChild.ChildNodes) GetNode(nodes, numArray[pos + 1], ref elem);     
      XmlElement current = doc.CreateElement("node"); 
      current.SetAttribute("value", numArray[pos + 1].ToString()); 
      ((XmlElement)elem.ParentNode).AppendChild(current); 
      pos++; 
      BuildXml(numArray, ref pos, ref doc, ((XmlElement)elem.ParentNode), current); 
     }   
    } 
} 

public static void GetNode(XmlElement elem, int val, ref XmlElement found) 
{ 
    if (int.Parse(elem.GetAttribute("value")) < val) 
     if (found == null || int.Parse(found.GetAttribute("value")) < val) found = elem; 
    foreach (XmlElement childElem in elem.ChildNodes) GetNode(childElem, val, ref found); 
}