Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 从级序遍历输出构造唯一的二叉搜索树_Algorithm_Data Structures_Tree_Binary Tree_Binary Search Tree - Fatal编程技术网

Algorithm 从级序遍历输出构造唯一的二叉搜索树

Algorithm 从级序遍历输出构造唯一的二叉搜索树,algorithm,data-structures,tree,binary-tree,binary-search-tree,Algorithm,Data Structures,Tree,Binary Tree,Binary Search Tree,我们可以使用预先排序的遍历输出构造唯一的二叉搜索树,如下所示: 5 / \ 4 8 / / 1 7 \ / 2 6 \ 3 第一个元素将是根 Left child=距离根最近的元素 右子元素=比根元素大的最近元素 这些事实很容易转换成代码。然而,我正在努力获得这样严格的事实/步骤,以将级别顺序遍历输出转换为唯一的二叉搜索树 例如,如果我有以下级别顺序遍历输出[5,4,8,1,7,2,6,3]

我们可以使用预先排序的遍历输出构造唯一的二叉搜索树,如下所示:

      5
    /   \
   4     8
  /      /
 1      7
  \    / 
   2  6
    \
     3 
  • 第一个元素将是根
  • Left child=距离根最近的元素
  • 右子元素=比根元素大的最近元素
  • 这些事实很容易转换成代码。然而,我正在努力获得这样严格的事实/步骤,以将级别顺序遍历输出转换为唯一的二叉搜索树

    例如,如果我有以下级别顺序遍历输出
    [5,4,8,1,7,2,6,3]
    ,我可以按如下方式形成BST:

          5
        /   \
       4     8
      /      /
     1      7
      \    / 
       2  6
        \
         3 
    
    级别顺序遍历中的第一个元素始终是根(级别0)。然后是级别1的元素。4小于5,所以我将把它作为左子pf 5。8大于5,所以我将把它作为5的正确孩子。(它不能是4岁的孩子,因为在这种情况下,它应该小于5岁。因此它不能出现在2级)。然后是1和7。1应该是4的孩子,因为它小于4。7不能是4的正确子级,因为它也大于5。所以它应该在5的右子树上。因此,它必须留给8岁的孩子,因为7岁小于8岁。我们可以继续为所有人提供同样的服务

    我觉得这是正常的BST创作。也就是说,它是通过按级别顺序输出的顺序在空BST中插入节点来创建BST的。它是?我的意思是,在从预序遍历输出构造唯一BST的情况下,有与上述步骤等价的步骤吗。或者我们只需要按照BST创建算法,按照级别顺序遍历输出的顺序在空BST中插入节点

    或者我们只需要按照BST创建算法,按照级别顺序遍历输出的顺序在空BST中插入节点

    这可以更有效地完成(线性时间vs.Θ(n log(n)),但需要小心完成。在你的口头描述中 ,何时移动到父级中的新节点的问题需要更加精确

    假设在构建树时,为每个节点v存储一个辅助变量c(v),该变量是截止值,超过该值,项不能是v的子项

    • 开始时,使用c(5)=构造节点5∞ (因为只有当某物大于∞ 它将不是此节点的子节点)

    • 下一项是1。自4
    • 下一项是8。同样,8
    • 类似地,1成为4的子级,并将其截止级别设为4

    • 7不能是4岁的孩子。它大于4的截止水平。我们继续上一级的下一个节点,即8。它确实可以是一个8岁的孩子,然后变成它的左孩子,把8作为它自己的临界值

    继续如上所述:

    • 如果每个节点位于上一级别节点的截止线下方,则它可以是上一级别节点的子节点。如果不是,则作为候选节点移动到上一级别中的下一个节点

    • 对于上一级别中新节点小于截止值的第一个节点:

      • 如果小于该节点,则它将成为左子节点,并将父节点的值作为其截止点

      • 如果大于节点,则它将成为右子节点,并将父节点的截断作为其自身的截断

    或者我们只需要按照BST创建算法,按照级别顺序遍历输出的顺序在空BST中插入节点

    这可以更有效地完成(线性时间vs.Θ(n log(n)),但需要小心完成。在你的口头描述中 ,何时移动到父级中的新节点的问题需要更加精确

    假设在构建树时,为每个节点v存储一个辅助变量c(v),该变量是截止值,超过该值,项不能是v的子项

    • 开始时,使用c(5)=构造节点5∞ (因为只有当某物大于∞ 它将不是此节点的子节点)

    • 下一项是1。自4
    • 下一项是8。同样,8
    • 类似地,1成为4的子级,并将其截止级别设为4

    • 7不能是4岁的孩子。它大于4的截止水平。我们继续上一级的下一个节点,即8。它确实可以是一个8岁的孩子,然后变成它的左孩子,把8作为它自己的临界值

    继续如上所述:

    • 如果每个节点位于上一级别节点的截止线下方,则它可以是上一级别节点的子节点。如果不是,则作为候选节点移动到上一级别中的下一个节点

    • 对于上一级别中新节点小于截止值的第一个节点:

      • 如果小于该节点,则它将成为左子节点,并将父节点的值作为其截止点

      • 如果大于节点,则它将成为右子节点,并将父节点的截断作为其自身的截断