Python二叉树序列化问题

3 投票
2 回答
1144 浏览
提问于 2025-04-17 02:54

我有一个二叉树的类,代码如下:

class BTree:
    def __init__(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right

    def __unicode__(self):
        return "%s" % self.data

还有一个树的序列化方法,代码如下:

class JTree(object):
    def __init__(self, id, children=None): 
        self.id = id 
        if children is None:
            children=[]
        self.children = children

def encode_tree(obj):
    if not isinstance(obj, JTree):
        raise TypeError("%r is not JSON serializable" % (o,))

    return obj.__dict__

接着我用下面的方式填充二叉树的数据:

bt = BTree("1")
bt.left =BTree("2")
bt.right=BTree("3")

如果我对这些数据进行序列化,就能得到以下结果:

tree = JTree(bt.data, [JTree(bt.left.data), JTree(bt.right.data)])

print json.dumps(tree, default=encode_tree)


{"id": "1", "children": [{"id": "2", "children": []}, {"id": "3", "children": []}]}

问题是我不知道该怎么写代码来生成这个结果。这意味着我想要一个生成器或者递归函数来运行这段代码:

JTree(bt.data, [JTree(bt.left.data), JTree(bt.right.data)])

有人能给我点建议吗?谢谢!

2 个回答

0

这个 json 模块只能把字典(dict)、列表(list)、字符串(string)、数字(number)、布尔值(boolean)和 None 这些类型的数据转成 JSON 格式。如果你想用自定义的类,建议还是用普通的 dict。另外,你也可以通过继承 json.JsonEncoder 类,并重写 default 方法,让它能把你的自定义类转换成上面提到的那些类型。

2

看起来你想要一个简单的递归函数,比如:

def convert_to_jtree(bt):
    return JTree(bt.data, [convert_to_jtree(bt.left) if bt.left else None,
                          convert_to_jtree(bt.right) if bt.right else None])

或者类似的东西。

撰写回答