将二叉树编码为json

时间:2011-09-22 04:19:11

标签: json sqlalchemy binary-tree

我正在使用sqlalchemy在db:

中存储二叉树数据
class Distributor(Base):
    __tablename__ = "distributors"

    id = Column(Integer, primary_key=True)
    upline_id = Column(Integer, ForeignKey('distributors.id'))
    left_id = Column(Integer, ForeignKey('distributors.id'))
    right_id = Column(Integer, ForeignKey('distributors.id'))

如何生成如上所列的json“tree”格式数据:

{'id':1,children:[{'id':2, children:[{'id':3, 'id':4}]}]}

2 个答案:

答案 0 :(得分:0)

我猜你要求以JSON格式存储数据?或者您是否尝试从标准关系数据构造JSON?

如果是前者,为什么不创建像:

这样的条目
{id: XX, parentId: XX, left: XX, right: XX, value: "foo"}

对于每个节点,然后从条目手动重建树?从头开始(parentId == null)然后组装分支。

如果数据库中有多个树,您还可以为树本身添加其他标识符。然后你只需要查询treeId是XXX的位置,然后从条目中构造树。

答案 1 :(得分:0)

我毫不犹豫地提供这个答案,因为我不确定我是否真的理解你要解决的问题(二叉树,JSON,sqlalchemy,这些都不是问题)。

使用这种结构可以做的是迭代每一行,随着时间的推移添加边。你将从基本上是对象的缓存开始;最终将成为你需要的树。

import collections
idmap = collections.defaultdict(dict)
for distributor in session.query(Distributor):
    dist_dict = idmap[distributor.id]
    dist_dict['id'] = distributor.id
    dist_dict.setdefault('children', [])
    if distributor.left_id:
        dist_dict.['children'].append(idmap[distributor.left_id])
    if distributor.right_id:
        dist_dict.['children'].append(idmap[distributor.right_id])

因此,我们收集了大量可以代表树的链接词。但是,我们不知道哪一个是根;

root_dist = session.query(Distributor).filter(Distributor.upline_id == None).one()
json_data = json.dumps(idmap[root_dist.id])