反序列化树,表示为String

时间:2016-05-23 06:35:45

标签: serialization tree deserialization

我正在寻找最小的代码片段来反序列化树。

不是二叉树。一个普通的。 cid表示为列表。 Node.childs表示叶子。

我的序列化方法:

empty list

以下树将产生字符串:

Tree

override
public String ToString()
{
    String toRet = "(";
    toRet += data;
    foreach (Node node in childs)
        toRet += " " + node.ToString();
    toRet += ")";
    return toRet;
}

1 个答案:

答案 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);
    }