【问题标题】:Binary Tree Structure二叉树结构
【发布时间】:2014-10-01 00:35:43
【问题描述】:

我正在尝试解决这个问题,其中一个新加入的对等点将被赋予一个索引 [0,1,2, ... n-1],基于已经存在的对等点对象的数量(例如 8 个存在 -> 新对等点将获得索引 8)。

我想根据它们的索引将这些对等对象添加到二叉树中。例如,peer 0 加入,它将成为 root,那么 peer 1 & peer 2 将成为 peer 0 的左右孩子。

我只需要二叉树遵循它应该有两个孩子的规则。

这是一个例子:

    0 

   / \

  1   2

 / \ / \

3  4 5  6

我的问题是我不确定如何实际执行此插入以保持 2 个孩子的规则。起初我假设一个正常的 BST 插入规则会起作用,但是一旦我真正编码了它,我就意识到了枢轴/键的问题——我是根据索引插入的。一切都会变成正确的孩子

我真的坚持这一点,但我认为解决方案应该是一个我无法看到的微不足道的解决方案。有什么建议吗?

编辑: 感谢您的帮助! 我想我想出了一些可以满足我需求的东西,所以我会把它留在这里。我将有一个隐式的二叉树结构。加入的对等点将根据其索引进入优先级队列。这将表示他们是否可以将孩子分配给他们,并且一旦有 2 个孩子,一个对等点将从该队列中删除

【问题讨论】:

  • 如果你想根据你已经给它的索引添加,那么你不需要二叉树,你需要一个数组。
  • @DaveZych 你可以索引一棵二叉树……你甚至可以使用一个数组来保存一棵二叉树……
  • @progenhard 我很清楚这一点。但他在将每个项目添加到 BT 之前为其分配了一个索引,并希望在将其添加到 BT 时使用该索引。他本质上是在构建一个链表。只需将项目添加到 BT 并让它自己构建。
  • @DaveZych 我最初确实有一个数组结构,但可能会有多达 10k 个对等点。随着新对等点的删除和添加,这将严重影响性能
  • @JerryFox 将它们添加到您最终得到的任何数据结构后,您的目标是什么?你需要搜索它们吗?循环遍历每一个并执行一些操作?

标签: binary-tree binary-search-tree insertion


【解决方案1】:

您要考虑的几件事:

为什么需要 BST?

顾名思义,BST 主要用于搜索。但是,如果您为每个加入唯一标识符的新用户分配一个唯一标识符,那么您不需要使用 BST 来搜索它们,因为您可以通过索引从数组中访问它们。

例如,如果每个用户都玩游戏并获得特定分数,那么 BST 会更有用。要将用户组织在一个数据结构中,使他们可以通过分数轻松搜索/组织,您可以在玩家完成游戏时将他们的 score 作为键插入到 BST 中。但是对于像这样的唯一标识符,没有理由使用 BST。实际上,您显示的数据结构不是 BST。 BST 看起来像这样:

   3 

  / \

 1   5

/ \ / \

0 2 4  6

另一种数据结构更合适吗?

如果您对为什么 BST 不是组织用户 ID 的有用结构有了更好的理解,那么接下来您应该考虑一下您实际上想要做什么。如果您只是想将所有用户存储在一个数据结构中,那么列表(数组)完全可以,其中列表的索引对应于用户 ID。

如果您希望为这些用户添加某种分组,请考虑使用哈希表。例如,如果您希望能够查找用户的朋友,您将创建一个哈希表,其中用户 ID(键)映射到朋友的用户 ID(值)列表。

希望这对您有所帮助。如果我还有什么可以提供的帮助,或者我还没有完全理解您想要完成的工作,请告诉我


更新

因此,根据上面的 cmets,您的困惑似乎在于二叉树和 BST 之间的区别。二叉树是每个节点有 search 树对节点键的值施加了额外的约束。二叉树结构是你想要的,但你不需要它来搜索,也不想比较这些值。

【讨论】:

  • 我实际上不想要一个 BST,而只是一个二叉树。我意识到这可能是我的问题
  • @ColonelThirtyTwo 这不是真的。 BST 是二叉树,但二叉树不是 BST。二叉树是每个节点最多有 2 个子节点的结构。 BST 是指所有左子节点都小于当前节点,所有右子节点都大于当前节点。
  • 对不起,我知道其中的区别,但我没有意识到我只提到了 BST
【解决方案2】:

对于任何给定的索引i,父节点将获得索引(i + 1 >> 1) - 1,子节点将获得索引(i << 1) + 1i + 1 << 1。我不知道这是否有帮助,因为我不确定您努力的目的。但这至少意味着您可以将所有对等节点保存在一个普通数组中,并通过仅使用节点的索引访问节点的子节点,将该普通数组用作二叉树结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多