【问题标题】:Constructing A Unique Binary Search Tree From Level Order Traversal Output从级别顺序遍历输出构造唯一的二叉搜索树
【发布时间】:2016-07-11 18:13:45
【问题描述】:

我们可以使用say pre order traversal output来构造唯一的二叉搜索树,如下所示:

  1. 第一个元素将是根。
  2. 左子元素 = 小于根的最近元素。
  3. 右子元素 = 比根大的最近元素。

这些事实很容易转换为代码。但是,我正在努力获得如此严格的事实/步骤来将级别顺序遍历输出转换为唯一的二叉搜索树。

例如,如果我有以下级别顺序遍历输出[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

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

【问题讨论】:

    标签: algorithm data-structures tree binary-tree binary-search-tree


    【解决方案1】:

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

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

    假设当你构建树时,对于每个节点 v,你存储一个辅助变量 c(v),它是一个项目不能超过的截止值成为 v 的孩子。

    • 开始时,用 c(5) = ∞ 构造节点 5(因为只有当某物大于 em> 会不会是这个节点的子节点)。

    • 下一项是1。由于4 ,那么1可以是5的孩子;因为比较小,所以肯定是左孩子。既然是左孩子,它的cutoff就是parent的值,所以c(4) = 5.

    • 下一项是 8。同样,8 ,所以它可以是孩子,但必须是右孩子。既然是右孩子,它的cutoff就是它的parent的cutoff,所以c(8) = ∞

    • 同样,1 成为 4 的子节点,并将其截止级别设为 4。

    • 7 不能是 4 的子节点。它大于 4 的截止级别。我们继续前进到上一层的下一个节点,即 8。它确实可以是 8 的子节点,并且成为它的左孩子,以 8 作为它自己的截止水平。

    如上继续:

    • 每个节点都可以是上一层节点的子节点,前提是它低于上一层节点的截止点。如果不是,则作为候选移至上一级的下一个节点。

    • 对于新节点小于cutoff的上一层的第一个节点:

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

      • 如果大于节点,则成为右孩子,并将父节点的cutoff作为自己的cutoff。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 2021-09-25
      相关资源
      最近更新 更多