【问题标题】:pre-order and "tree_insert" on a BSTBST 上的预购和“tree_insert”
【发布时间】:2016-01-05 06:17:25
【问题描述】:

如果我有一个 BST(称之为 - T)并在其上运行 PRE-ORDER, 如何显示/证明在我从预购中获得的序列上运行函数“tree_insert”,我得到完全相同的树-T(我开始使用)?

谢谢,

【问题讨论】:

标签: binary-search-tree preorder


【解决方案1】:

例如,假设您有 3 个元素。

插入时,将插入的第一个元素作为根,然后下一个元素(无论是小还是大)将相应地放置在左侧或右侧。前序遍历就是先访问root,然后递归访问左孩子,再递归访问右孩子。所以预购后会显示根,较小的元素,然后是较大的元素。现在尝试再次插入这 3 个元素。您将收到相同的树。 (插入的第一个元素将是根。然后较小的元素将再次向左移动,较大的元素将自动向右移动)。您可以使用 6 个不同的场景和 3 个元素对此进行建模。

场景 1:要插入的元素 = {1, 2, 3} 根 = 1,右孩子 = 2,最右边 = 3

做preOrder时,先访问1。没有左孩子,所以接下来访问 2。 2 没有左孩子,所以接下来访问 3。 (1, 2, 3)

场景 2:要插入的元素 = {2, 1, 3} 根 = 2,左孩子 = 1,右孩子 = 3

做preOrder时,先访问2。留下孩子 1,所以接下来要访问它。右孩子是 3,所以接下来访问它。 (2, 1, 3)

场景 3:要插入的元素 = {3, 1, 2} root = 3,左孩子 = 1,左孩子的右孩子(高度为 1)= 2

做preOrder时,先访问3。左孩子是 1,所以接下来访问它。没有 1 的左孩子,所以接下来访问 3。 (3, 1, 2)

还有 3 个场景,您可以自己写出来并检查。

【讨论】:

  • 也许使用“show”(如示例)不是最佳选择。我想我应该使用归纳法来证明这对所有情况都是正确的,并且基本步骤很明显,但是我不太确定如何建立我的假设...(假设它对于所有高度为 1...n 的树都是正确的?)
  • 是的,你可以这样做。分解为 6 ​​个案例是我的第一种方法,但我确信可能有一种更倾向于数学的方法来使用理论来做到这一点。
【解决方案2】:

对于给定的树的前序遍历,可以形成多个 BST。如果您在预购遍历的同时还有 INORDER 遍历,则可以生成唯一的 BST。

【讨论】:

  • 你能给我一个预购序列的例子,它在使用insert_tree时可以生成多个BST?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多