0

我有一些数字说 110,111,114,115,120,121,112,122,130,131 现在我需要在 xml 树中列出它们

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

也就是说,如果一个数字 x[i+1] 是 x[i] +1,那么两者都被添加为同一棵树的子级。否则将 x[i+1] 添加到子树到 x[i]

我知道它必须以递归方式完成,但我是如此愚蠢以至于我无法做到正确?急需帮助。

4

4 回答 4

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,则将父节点重新分配给最后一个节点。然后将新节点添加到保存的父节点

于 2013-03-06T07:48:56.130 回答
0

它实际上如您所描述的那样工作,但该描述比递归更线性:

如果一个数字 x[i+1] 是 x[i] +1 则两者都被添加为同一棵树的子节点。否则将 x[i+1] 添加到子树到 x[i]

所以这只是一个循环,将前一个节点初始化为 xml 文档的根元素。对于提供的数字序列

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

然后它会生成以下 XML(PHP 示例):

<?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 表达式等来解决它。

于 2013-03-06T07:44:21.267 回答
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);
}
于 2013-03-06T08:00:51.547 回答
0

你需要一些堆栈;

stack<int> nodeHierarchy;

然后算法很简单:检查元素是否高于前一个。如果是这样,那将是它的兄弟姐妹或孩子。

否则,您需要返回堆栈并再次执行此操作。

如果元素是兄弟,则需要再次返回堆栈。

让我们假设 root 为 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);
}

我相信,这就是你的想法,但你描述错了。如果我错了,其他两个答案应该是正确的。

于 2013-03-06T07:53:33.630 回答