2013-03-06 2 views
0

У меня есть некоторые цифры говорят 110.111.114.115.120.121.112.122.130.131 теперь мне нужно перечислить их в XML-дерева, какПредставляя ряд чисел, как XML-дерева

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

То есть, если число х [г + 1] является х [i] +1, то оба они добавляются как дети одного дерева. else x [i + 1] добавляется к дочернему дереву к x [i]

Я знаю, что это нужно делать рекурсивно, но я настолько тупой, что я не в состоянии понять это правильно? В отчаянной необходимости помощи.

+0

, но в соответствии с Вашим образцом, не должен '130 и 131 узлы являются дочерними элементами 112? –

ответ

0

Это на самом деле работает, как вы описали, но это описание является более линейным, чем рекурсивный:

, если число х [г + 1] х [я] +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, то оба они добавляются как дети одного дерева. else x [i + 1] добавляется к дочернему дереву к x [i]

В соответствии с этим описанием вы не подходите к высоким уровням дерева. Так что ваше дерево должно выглядеть следующим образом:

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

Просто следить последнего родителя, и если х [г + 1] <> х [I] +1, переназначить родителя последнего узла. А затем добавьте новый узел в сохраненный родитель.

+0

неверно, ему нужно 112 быть прямым братом 111, поскольку он удовлетворяет x [i + 1] = x [i] +1 для этих двух. –

+0

Нет, потому что 112 не идет сразу после 111 в массиве, который называется x, я думаю. – DixonD

+0

Вот почему ему нужно рекурсивное решение. независимо от того, какой порядок в массиве; так что означает, что currentNode всегда должен быть больше предыдущего узла, если не повторять итерацию назад и узнать последний предыдущий узел, которому он больше. –

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); 
} 
Смежные вопросы