Python 将二叉树结构编码为json格式
我有一个python二叉树类,如下所示:Python 将二叉树结构编码为json格式,python,data-structures,encoding,binary-tree,Python,Data Structures,Encoding,Binary Tree,我有一个python二叉树类,如下所示: 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 def tree_traversal
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
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
我有这样的树遍历函数:
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
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
现在我陷入了生成数据格式的困境,如下面的嵌套结构:
{'id':1,children:[{'id':2, children:[{'id':3, 'id':4}]}]}
树形结构为:
1
|
2
(left)3 (right)4
--编辑--
您希望在每个节点中保留什么值?如果如您的示例所示,它只是一个int,那么应该很简单:
节点具有一个id、一个或多个子节点和一个值:
{
“1”:{“children”:[“2”],“value”:1111},
“2”:{“children”:[“3”,“4”],“value”:2222},
“3”:{“children”:null,“value”:3333},
“4”:{“children”:null,“value”:4444}
}--编辑--
您希望在每个节点中保留什么值?如果如您的示例所示,它只是一个int,那么应该很简单:
节点具有一个id、一个或多个子节点和一个值:
{
“1”:{“children”:[“2”],“value”:1111},
“2”:{“children”:[“3”,“4”],“value”:2222},
“3”:{“children”:null,“value”:3333},
“4”:{“children”:null,“value”:4444}
}您需要做的是将类序列化为字典和字符串的数据结构。我没有找到任何通用的方法来实现这一点,所以我通常要做的是让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"])
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
您需要做的是将类序列化为字典和字符串的数据结构。我没有找到任何通用的方法来实现这一点,所以我通常要做的是让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"])
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
如果您熟悉stack,可以看到下面的代码
"""
@param root: The root of binary tree.
@return: Preorder in list which contains node values.
"""
def preorderTraversal(self, root):
if root is None:
return []
stack = [root]
preorder = []
while stack:
node = stack.pop()
preorder.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return preorder
如果您熟悉stack,可以看到下面的代码
"""
@param root: The root of binary tree.
@return: Preorder in list which contains node values.
"""
def preorderTraversal(self, root):
if root is None:
return []
stack = [root]
preorder = []
while stack:
node = stack.pop()
preorder.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return preorder
我看不出有什么问题……你到底遇到了什么问题?我一直在为树结构生成json数据格式。你建议的json结构是不明确的。在您的JSON示例中,我们如何知道2是1的左子级还是右子级?你想在JSON中使用“children”这个词有什么原因吗?我在这里没有看到任何问题……你到底遇到了什么问题?我一直在为树结构生成JSON数据格式。你建议的JSON结构是不明确的。在您的JSON示例中,我们如何知道2是1的左子级还是右子级?你想在JSON中使用“children”这个词有什么原因吗?实际上我定义了一个树结构作为BinaryTree类,并且创建了一个树对象。但现在我面临的问题是将结构“编码”为json格式,这样我就可以使用javascript库来表示它。这不是他的问题。他需要从BinaryTree中创建一个可序列化的数据结构。@RonReiter哦,是的,很抱歉我没有领会他的意思,我编辑了答案,以便更好地提供一个易于实现的JSON结构。实际上,我有一个定义为BinaryTree类的树结构,并且创建了一个tree对象。但现在我面临的问题是将结构“编码”为json格式,这样我就可以使用javascript库来表示它。这不是他的问题。他需要从BinaryTree创建一个可序列化的数据结构。@RonReiter哦,是的,很抱歉我没有领会他的意思,我已经编辑了答案,以便更好地提供一个易于实现的JSON结构