将二叉树结构编码为JSON格式
我有一个这样的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(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
3 个回答
0
如果你对栈这种数据结构有点了解的话,可以看看下面的代码。
"""
@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
2
你想在每个节点里存储什么值呢?如果只是像你例子里那样的整数,那其实挺简单的:
一个节点有一个ID,可能有一个或多个子节点,还有一个值:
{
"1" : { "children" : ["2"] , "value" : 1111 },
"2" : { "children" : ["3","4"] , "value" : 2222 },
"3" : { "children" : null , "value" : 3333 },
"4" : { "children" : null , "value" : 4444 }
}
4
你需要做的是让你的类可以被转换成一个包含字典和字符串的数据结构。我没有找到任何通用的方法来实现这一点,所以我通常会让二叉树实现一些“扁平化”和“解析”的功能。一个好的实现方法是这样的:
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