【问题标题】:Deserialize Binary Search Tree from a string从字符串反序列化二叉搜索树
【发布时间】:2017-10-29 03:08:09
【问题描述】:

刚刚练习并注意到很容易序列化(通过深度优先搜索遍历)bst 并将其反序列化回树中。但是如果序列化是通过面包优先搜索遍历完成的,我很难反序列化它。

例如,给定输入:5,2,11,N,3,7,19,N,N,6,8,N,N,N,N,N,N 寻找输出 -

      5
    /   \
   2     11
  / \    /  \
 N   3  7    19
      / \    / \
     6   8  N   N
    /\  / \
   N  N N N

【问题讨论】:

  • 哪种编程语言?这是您忘记添加的最重要的标签。其次,你尝试过什么,你在哪里卡住了?
  • 3 应该有孩子 N N

标签: java algorithm recursion binary-search-tree breadth-first-search


【解决方案1】:

记住,这是二叉树树搜索,这意味着每个节点只有左右两个孩子。

(假设 N 代表 Null/no 节点): 建立你的树。输入序列中的第一个元素是根元素,接下来的两个被分配为根的左孩子,然后是右孩子。然后使用 bfs 去你的树。如果孩子是 N,则转到下一个孩子,如果孩子是一个值,则将输入序列中的下两个值分配为该节点的左右孩子。以此类推。

示例:
5,2,11,N,3,7,19,N,N,6,8,N,N,N,N,N,N
将 5 指定为根。

将 5 视为节点 -> 它是一个值,分配子节点:
2,11,N,3,7,19,N,N,6,8,N,N,N,N,N,N //处理5次后的剩余输入
将 2 分配为左孩子。
11,N,3,7,19,N,N,6,8,N,N,N,N,N,N
分配 11 作为右孩子。
// 在 dept 0 完成整个宽度

将 2 视为节点 -> 它是一个值,分配子节点:
N,3,7,19,N,N,6,8,N,N,N,N,N,N
将 N 分配为左孩子。
3,7,19,N,N,6,8,N,N,N,N,N,N
将 3 指定为右孩子。

将 11 视为节点 -> 它是一个值,分配子节点:
7,19,N,N,6,8,N,N,N,N,N,N
分配 7 作为左孩子。
19,N,N,6,8,N,N,N,N,N,N
分配 19 作为右孩子。
// 在深度 1 完成整个宽度

将 N 视为节点 -> 不是值,继续下一个宽度节点。
将 3 视为节点 -> 它是一个值,分配子节点:
N,N,6,8,N,N,N,N,N,N
将 N 分配为左孩子。
N,6,8,N,N,N,N,N,N
将 N 分配为右孩子。

将 7 视为节点 -> ... 等

您在分析输入字符串时构建一棵树,并使用广度优先搜索到达此构建树中的下一个叶子,如果它具有有效值,那么它将分配您输入字符串中的下两个元素作为左右孩子。

【讨论】:

    【解决方案2】:

    要反序列化通过广度优先遍历生成的字符串,您基本上使用相同的机制。使用一个队列,在该队列上放置对应该注入新子项的位置的引用。当您注入一个新的子节点时,在队列中再添加两个引用,每个大子节点一个。

    由于队列是先进先出的,子元素的注入将按照广度优先顺序进行。

    这是它在 Python 中的样子:

    def to_tree(serialised):
        container = [None]
        leaves = [[container, 0]] # put the reference to the root on the queue
    
        for value in serialised.split(","):
            children, childIndex = leaves.pop(0) # pull from queue
            if value != 'N':
                node = children[childIndex] = {
                    "value": value,
                    "children": [None, None]
                }
                # append the new 2 child references to the queue
                leaves.append([node["children"], 0])
                leaves.append([node["children"], 1])
            if len(leaves) == 0: # should not happen if input is complete
                break 
    
        return container[0] # return the root
    
    # Example call
    tree = to_tree("5,2,11,N,3,7,19,N,N,6,8,N,N,N,N,N,N")
    
    # Output the result in JSON format
    import json
    print(json.dumps(tree, indent=2))
    

    上面的输出是:

    {
      "value": "5",
      "children": [
        {
          "value": "2",
          "children": [
            null,
            {
              "value": "3",
              "children": [
                null,
                null
              ]
            }
          ]
        },
        {
          "value": "11",
          "children": [
            {
              "value": "7",
              "children": [
                {
                  "value": "6",
                  "children": [
                    null,
                    null
                  ]
                },
                {
                  "value": "8",
                  "children": [
                    null,
                    null
                  ]
                }
              ]
            },
            {
              "value": "19",
              "children": [
                null,
                null
              ]
            }
          ]
        }
      ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多