【问题标题】:Creating random keys for binary searching tree为二叉搜索树创建随机键
【发布时间】:2014-11-24 13:59:15
【问题描述】:

我的目标是为伪帕斯卡代码的编译器创建一个 BST(二叉搜索树)。

据我所知,BST 的工作原理是这样的:我有一个根,它有一些密钥 - 依赖于我的生成密钥(如果它大于或小于根密钥)我从左侧或右侧插入一个节点根。

显然,如果我使用数字作为键,树会变成这样:

1
 \
  2
   \
    3

我想要的是一个平衡的 BST,像这样:

  1
 / \
2   3
... etc.

这些键显然不会发生这种情况。当我想实现这种结构时,节点的键应该如何?有没有办法在不记住最后插入的密钥的情况下做到这一点?

这也让我想到什么“键”应该用于树的绝对根?所以我可以从它的左侧和右侧添加键?

【问题讨论】:

  • 你已经标记了这个 C 和二叉树。您是否有一个 C 代码示例来展示您尝试过的内容? sscce
  • 我认为第二个例子应该是2 到根目录。
  • @ryyker 是的,我确实有它的代码,但它与问题无关,因为我更好奇它的原理。我编辑了标签。 :)

标签: binary-tree


【解决方案1】:

当你插入一个节点时,你从根节点向下移动以找到合适的插入点:

1     1     1
       \     \
        2     2
               \
                3

插入后,当你回到root的时候,你检查每个左右节点是否足够平衡。如果没有,则旋转它们:

1         2
 \       / \
  2     1   3
   \
    3

这意味着更深分支的第一个节点是新的根节点,旧的根节点将成为该节点的子节点。

所以根节点会在必要时改变,并且总是具有“最中间”的值。

【讨论】:

    【解决方案2】:

    应用AVL tree的概念来平衡树状结构。

    根据您的要求:

        1
       / \
      2   3
    

    上面的树只是考虑binary tree而不是binary Search Tree

    但是上面提到的树可以通过从上到下和从左到右的方式构造。

    【讨论】:

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