- .
Node :
public class Node
{
public Node Parent;
public string Value;
public List<Node> SubNodes;
}
node:
var input = "2[5],3[6,12[15,16]]";
var tree = string.Format("root[{0}]", input);
:
Node root = new Node { Parent = null, Value = string.Empty, SubNodes = new List<Node>() };
Node node = root;
foreach (char c in tree)
{
switch (c)
{
case '[':
node = new Node { Parent = node, Value = string.Empty, SubNodes = new List<Node>() };
node.Parent.SubNodes.Add(node);
break;
case ',':
node = new Node { Parent = node.Parent, Value = string.Empty, SubNodes = new List<Node>() };
node.Parent.SubNodes.Add(node);
break;
case ']':
node = node.Parent;
break;
default:
node.Value += c;
break;
}
}
:
root
|
| |
|
|
|
|
|
|
, ChildLookup :
var lookup = new ChildLookup(root);
...
class ChildLookup
{
Dictionary<string, Node> nodes;
public ChildLookup(Node node)
{
nodes = new Dictionary<string, Node>();
AddNodes(node);
}
private void AddNodes(Node node)
{
nodes[node.Value] = node;
foreach (var item in node.SubNodes)
AddNodes(item);
}
public IEnumerable<string> GetChildren(string key)
{
if (!nodes.ContainsKey(key)) throw new KeyNotFoundException();
return nodes[key].SubNodes.Select(c => c.Value);
}
}