我正在尝试解决这个问题,根据已经存在多少个对等对象,新的加入对等体将被赋予索引[0,1,2,... n-1](例如8个存在 - > new peer会获得索引8)。
我想根据索引将这些对等对象添加到二叉树中。例如,peer 0加入并且它将是根,然后是peer 1& peer 2将是peer 0的左右孩子。
我只需要二叉树遵循它应该有两个孩子的规则。
以下是一个例子:
0
/ \
1 2
/ \ / \
3 4 5 6
我的问题是我不确定如何实际进行此插入以保持2个孩子的规则。起初我假设正常的BST插入规则可行,但是一旦我实际编码了,我意识到了pivot / key的问题 - 我是基于索引插入的。一切都会成为一个正确的孩子
我真的坚持这个但我认为解决方案应该是一个我无法看到的微不足道的解决方案。有什么建议吗?
编辑: 感谢您的帮助! 我想我找到了能够满足我需求的东西,所以我会留在这里。我将有一个隐式二叉树结构。加入的对等方将根据其索引进入优先级队列。这将表明他们是否可以分配孩子和他们。一旦有2个孩子
,同伴将从此队列中删除答案 0 :(得分:2)
您要考虑的一些事项:
为什么要BST?
BSTs,顾名思义,主要用于搜索。但是,如果要为每个加入唯一标识符的新用户分配,那么您不需要使用BST来搜索它们,因为您可以通过索引从数组中访问它们。
如果每个用户玩游戏并获得特定分数,则BST会更有用。要在数据结构中组织用户以便通过分数轻松搜索/组织用户,您可以在完成游戏时将玩家以得分作为关键字插入BST。但对于像这样的唯一标识符,没有理由使用BST。实际上,您在那里显示的数据结构不是BST。 BST看起来像这样:
3
/ \
1 5
/ \ / \
0 2 4 6
其他数据结构更合适吗?
如果您已经更好地理解为什么BST不是用于组织用户ID的有用结构,那么您接下来应该考虑一下您实际上正在尝试做什么。如果您只是尝试将所有用户存储在数据结构中,则列表(数组)完全正常,其中列表的索引对应于用户ID。
如果您希望为这些用户添加某种分组,请考虑使用哈希表。例如,如果您希望能够查找用户的朋友,则可以创建一个哈希表,其中用户ID(键)映射到朋友的用户ID列表(值)。
希望这会有所帮助。如果还有其他我可以做的帮助,或者如果我还没有完全理解你想要完成什么,请告诉我
<强>更新强>
因此,基于上面的评论,您似乎对二叉树和BST之间的区别感到困惑。二叉树是任何树,其中每个节点具有&lt; = 2个子节点,而二进制搜索树对节点的键的值施加额外约束。二叉树结构是您想要的,但您不需要它进行搜索,也不想比较这些值。
答案 1 :(得分:0)
对于任何给定索引i
,父节点将获得索引(i + 1 >> 1) - 1
,子节点将获得索引(i << 1) + 1
和i + 1 << 1
。我不知道这是否有任何帮助,因为我不确定你努力的目的。但这至少意味着您可以将所有对等体保存在普通数组中,并通过仅使用节点索引访问节点的子节点,将该普通数组用作二叉树结构。