【问题标题】:Encoding a binary tree structure to json format将二叉树结构编码为 json 格式
【发布时间】:2011-09-22 03:31:57
【问题描述】:

我有一个这样的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

【问题讨论】:

  • 我在这里没有看到任何问题...
  • 您遇到的具体问题是什么?
  • 我在为树结构生成 json 数据格式时遇到了困难。
  • 您提出的 JSON 结构不明确。在您的示例 JSON 中,我们如何知道 2 是 1 的左孩子还是右孩子?您是否有理由在 JSON 中使用“儿童”一词?

标签: python data-structures encoding binary-tree


【解决方案1】:

您需要做的是使您的类可序列化为字典和字符串的数据结构。我没有找到任何通用的方法,所以我通常做的是让 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

【讨论】:

    【解决方案2】:

    -- 已编辑--

    您希望在每个节点中保留什么值?如果它只是您的示例所示的 int,则应该很容易:

    一个节点有一个 id、一个或多个子节点和一个值: { “1”:{“孩子”:[“2”],“价值”:1111}, “2”:{“孩子”:[“3”,“4”],“价值”:2222}, “3”:{“孩子”:空,“价值”:3333}, “4”:{“孩子”:空,“价值”:4444} }

    【讨论】:

    • 实际上我有一个定义为 BinaryTree 类的树结构,并且我创建了一个树对象。但现在我面临着将结构“编码”为 json 格式的问题,因此我可以使用 javascript lib 来呈现它。
    • 这不是他的问题。他需要从 BinaryTree 创建一个可序列化的数据结构。
    • @RonReiter 哦,是的,对不起,我错过了他的观点,我已经编辑了答案以更好地提供易于实现的可能 JSON 结构
    【解决方案3】:

    如果你熟悉堆栈,可以看下面的代码。

    """
    @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
    

    【讨论】:

      猜你喜欢
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 2021-02-07
      相关资源
      最近更新 更多