将二叉树结构编码为json格式 [英] Encoding a binary tree structure to json format

查看:1887
本文介绍了将二叉树结构编码为json格式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的python二叉树类:

  class BinaryTree:
def __init __(self,data ,left = None,right = None)
self.data = data
self.left = left
self.right = right

def __unicode __(self) :
返回'%s'%self.data

我有树遍历功能这个:

  def tree_traversal(tree):
如果树:
在tree_traversal中为node_data(树。 left):
yield node_data
在tree_traversal中的node_data(tree.right):
yield node_data

现在我正在生成像下面的嵌套结构一样的数据格式:

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

树结构是:

  1 

|

2

(左)3(右)4


解决方案

您需要做的是将您的类序列化为字典和字符串的数据结构。我没有找到任何这样做的一般方法,所以我通常做的是使BinaryTree实现某种或平坦化和解析功能。一个很好的方式是这样做:

  import json 

class BinaryTree:
def __init __(self,data,left = None,right = None):
self.data = data
self.left = left
self.right = right

def flatten(self):
return {
data:self.data,
left:self.left.flatten()if self.left else None,
right:self.right.flatten()if self.right else None,
}

@classmethod
def from_dictionary(cls,d):
obj = cls(d [data])

如果d.has_key(left)和d [left]不是None:
obj.left = cls.from_dictionary (d [left])

如果d.has_key(right)和d [right]不是无:
obj.right = cls.from_dictionary(d [ right])

return obj

如果__name__ ==__main__:
binary_tree = BinaryTree.from_dictionary({data:hello lef t:{data:yo}})
json_data = json.dumps(binary_tree.flatten())
打印JSON:%s%json_data
binary_tree_from_json = BinaryTree .from_dictionary(json.loads(json_data))

打印binary_tree_from_json.data
打印binary_tree_from_json.left.data


I have a python binary tree class like this:

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

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

and I have tree traversal function like this:

  def tree_traversal(tree):
        if tree:
            for node_data in tree_traversal(tree.left):
                yield node_data
            for node_data in tree_traversal(tree.right):
                yield node_data

now I'm getting stuck in generating a data format like the below nested structure:

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

the tree structure is:

1

|

2

(left)3 (right)4

解决方案

What you'll need to do is to make your class serializable into a data structure of dictionaries and strings. I didn't find any general way of doing this, so what I usually do is make the BinaryTree implement some sort of or "flattening" and "parsing" function. A good way of doing this is this:

import json

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

    def flatten(self):
        return {
            "data" : self.data, 
            "left" : self.left.flatten() if self.left else None,
            "right" : self.right.flatten() if self.right else None,
        }

    @classmethod
    def from_dictionary(cls, d):
        obj = cls(d["data"])

        if d.has_key("left") and d["left"] is not None:
            obj.left = cls.from_dictionary(d["left"])

        if d.has_key("right") and d["right"] is not None:
            obj.right = cls.from_dictionary(d["right"])

        return obj

if __name__ == "__main__":
    binary_tree = BinaryTree.from_dictionary({"data": "hello", "left": {"data" :  "yo"}})
    json_data = json.dumps(binary_tree.flatten())
    print "JSON: %s" % json_data
    binary_tree_from_json = BinaryTree.from_dictionary(json.loads(json_data))

    print binary_tree_from_json.data
    print binary_tree_from_json.left.data

这篇关于将二叉树结构编码为json格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆