Python二叉树序列化问题

3
我有一个二叉树类,如下所示:

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个回答

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])

或者类似的东西。

这非常酷!感谢您解决我的问题!有一个小修复:convert_to_jtree(bt.left) - georgehu

0

json 模块只能序列化字典、列表、字符串、数字、布尔值和 None。因此,不要使用自定义类,而应该考虑使用普通的 dict。或者,您可以子类化 json.JsonEncoder 并覆盖 default 方法,以便为您的自定义类返回其中一种类型。


实际上是可以的。我刚刚添加了json.dumps。不过,我的问题是,是否有任何方法可以运行像这样的代码:JTree(bt.data,[JTree(bt.left.data),JTree(bt.right.data)])。 - georgehu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接