我正在寻找最小的代码片段来反序列化树。
不是二叉树。一个普通的。 cid
表示为列表。 Node.childs
表示叶子。
我的序列化方法:
empty list
以下树将产生字符串:
override
public String ToString()
{
String toRet = "(";
toRet += data;
foreach (Node node in childs)
toRet += " " + node.ToString();
toRet += ")";
return toRet;
}
答案 0 :(得分:0)
诀窍是寻找匹配的parens。两个匹配的parens定义一个子树。最外面的匹配的parens给整个树。以下是一个直接的解决方案,绝对不是任何意义上的最小化。
private static int match(String s) {
int balance = 0;
for(int i = 0; i < s.Length; i++) {
if(s[i] == '(') {
balance++;
} else if(s[i] == ')') {
balance--;
}
if(balance == 0) {
return i;
}
}
throw new FormatException("Parens not balanced!");
}
public static Node Deserialize(String s) {
if(s.Length == 0) {
return null;
}
// Find the ending index of current node value
int end = s.IndexOf(' ');
if(end == -1) {
end = s.IndexOf(')');
}
int i = end + 1; // skip past node value and seek for children
List<Node> children = new List<Node>();
while(i < s.Length) {
if(s[i] == '(') {
int j = Node.match(s.Substring(i));
children.Add(Node.Deserialize(s.Substring(i, j + 1)));
i += j;
}
i++;
}
return new Node(s.Substring(1, end - 1), children);
}